前言篇: 为了节约成本,决定通过自研来改造rocketmq,添加任意时间延迟的延时队列,开源版本的rocketmq只有支持18个等级的延迟时间, 其实对于大部分的功能是够用了的,但是以前的项目,全部都是使用了阿里云的rocketmq,原因是不同的供应商的订单的延时时间是不同的 (部分供应商的订单未支付30分钟取消,有些1个半小时取消,各种时间都有), 所以使用了大量的延时队列,但是开源版本不支持任意时间延时(希望官方支持这个功能) 为了实现这个功能,网上查询了不少资料,查询到不少相关的文章,主要…
最近项目里需要在延时队列,但是开源版本rocketmq不支持任意时间延时,造成有些任务无法执行 参考了网上的不少文章,但是都么有实现,所以再开源的基础上改造了个支持任意时间延时的队列. 源码地址: https://gitee.com/venus-suite/rocketmq-with-delivery-time 概念介绍 开源版本中,只有RocketMQ支持延迟消息,且只支持18个特定级别的延迟付费版本中,阿里云和腾讯云上的MQ产品都支持精度为秒级别的延迟消息 定时消息:Producer将消息发…
1 启动消费者等待传入的订阅消息 import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; import o…
上图是通过RocketMQ源码分析一个实现原理方案示意图. 分为两个部分: 消息的写入消息的Schedule 在写入CommitLog之前,如果是延迟消息,按照每10分钟写入delayfile文件,对于快到时间执行的,直接写入时间轮,并且写入delayfile,时间轮每秒钟执行,如果时间到了,就执行队列中的任务,写入commitlog文件中,commitlog会自动写入 comsumqueue中,然后客户端就能消费到了. 为什么delayfile文件保存10分钟的数据呢,考虑到时间轮不能太多任务…
时间轮和秒级文件实现原理图 这种方案比较简单实现,通过秒级时间,建立对应的文件夹,只要相同的时间超时的消息,就在同一个目录,通过msgid保证文件不重复,等到了时间后,就扫描对应的文件夹的文件,发送到队列中,写入commitlog即可. 当然了,我们可以先缓冲一定时间的文件夹文件,这样效率高一些. 我也开发这种方案的实现(简易版本),在测试环境跑了2周,(测试了每秒5000条延时消息)暂时没有问题,说明对于延迟消息不大的情况下,这个方案最简单,也是不错的选择…
简单的来说,就是rocketmq发送消息到broker的时候,判断是否定时消息, 如果是定时消息,将消息发送到代理服务(这个是一个独立的服务,需要自己开发,定时地把消息发送出去), 当然了消息用什么来保存呢?可以是数据库,redis等等,不过我推荐采用文件,因为消息可能会比较多,需要保存一定的时间,可以考虑RocksDB,这个效率非常的高效. 用什么来通信呢,我觉得 netty 比较好,当然了http也是可以的. 这种方式实现的好处是,不需要修改rocketmq服务端,修改发送消息的mq客户端就…
新的阅读体验:http://www.zhouhong.icu/post/157 一.业务需求 需要实现一个提前二十分钟通知用户去做某件事的一个业务,拿到这个业务首先想到的最简单得方法就是使用Redis监控Key值:在排计划时候计算当前时间与提前二十分钟这个时间差,然后使用一个唯一的业务Key压入Redis中并设定好过期时间,然后只需要让Redis监控这个Key值即可,当这个Key过期后就可以直接拿到这个Key的值然后实现发消息等业务. 关于Redis实现该业务的具体实现在之前我已经记过一篇笔记,…
一.前言 延迟队列的使用场景:1.未按时支付的订单,30分钟过期之后取消订单:2.给活跃度比较低的用户间隔N天之后推送消息,提高活跃度:3.过1分钟给新注册会员的用户,发送注册邮件等. 实现延迟队列的方式有两种: 通过消息过期后进入死信交换器,再由交换器转发到延迟消费队列,实现延迟功能: 使用rabbitmq-delayed-message-exchange插件实现延迟功能: 注意: 延迟插件rabbitmq-delayed-message-exchange是在RabbitMQ 3.5.7及以上…
转载自 https://github.com/alibaba/RocketMQ/wiki/rmq_vs_kafka RocketMQ与Kafka对比(18项差异) 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011年初,Linkin开源了Kafka这个优秀的消息中间件,淘宝中间件团队在对Kafka做过充分Review之后,Kafka无限消息堆积,高效的持久化速度吸引了我们,但是…
延迟任务应用场景 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单. 场景三:过1分钟给新注册会员的用户,发送注册邮件等. 实现方案 定时任务轮询数据库,看是否有产生新任务,如果产生则消费任务 pcntl_alarm为进程设置一个闹钟信号 swoole的异步高精度定时器:swoole_time_tick(类似javascript的setInterval)和swoole_time_afte…