最近研究消息队列,发现好几个框架,搜罗一下进行对比,说一下选型说明: 1)中小型软件公司,建议选RabbitMQ.一方面,erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便.不考虑rocketmq和kafka的原因是,一方面中小型软件公司不如互联网公司,数据量没那么大,选消息中间件,应首选功能比较完备的,所以kafka排除.RocketMQ也很不错,只是没有RabbitMQ出来的早,文档和网上的资料没有RabbitMQ多,但也是很不错,RocketMQ是阿里出品,现在阿里已经把…
前言 前段时间在编写通用的消息通知服务时,由于需要实现类似通知失败时,需要延后几分钟再次进行发送,进行多次尝试后,进入定时发送机制.此机制,在原先对接银联支付时,银联的异步通知也是类似的,在第一次通知失败后,支付标准服务会重发,最多发送五次,每次的间隔时间为1.4.8.16分钟等.本文就简单讲解下使用RabbitMQ实现延时消息队列功能. 前言 一点知识 延时队列使用场景 RabbitMQ实现延时队列 存活时间(Time-To-Live 简称 TTL) 死信交换(Dead Letter Exch…
什么是延迟队列 延迟队列存储的对象肯定是对应的延迟消息,所谓"延迟消息"是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 场景一:在订单系统中,一个用户下单之后通常有30分钟的时间进行支付,如果30分钟之内没有支付成功,那么这个订单将进行一场处理.这是就可以使用延迟队列将订单信息发送到延迟队列. 场景二:用户希望通过手机远程遥控家里的智能设备在指定的时间进行工作.这时候就可以将用户指令发送到延迟队列,当指令设定的时间到了再将指令推送到…
最近项目里需要在延时队列,但是开源版本rocketmq不支持任意时间延时,造成有些任务无法执行 参考了网上的不少文章,但是都么有实现,所以再开源的基础上改造了个支持任意时间延时的队列. 源码地址: https://gitee.com/venus-suite/rocketmq-with-delivery-time 概念介绍 开源版本中,只有RocketMQ支持延迟消息,且只支持18个特定级别的延迟付费版本中,阿里云和腾讯云上的MQ产品都支持精度为秒级别的延迟消息 定时消息:Producer将消息发…
前言篇: 为了节约成本,决定通过自研来改造rocketmq,添加任意时间延迟的延时队列,开源版本的rocketmq只有支持18个等级的延迟时间, 其实对于大部分的功能是够用了的,但是以前的项目,全部都是使用了阿里云的rocketmq,原因是不同的供应商的订单的延时时间是不同的 (部分供应商的订单未支付30分钟取消,有些1个半小时取消,各种时间都有), 所以使用了大量的延时队列,但是开源版本不支持任意时间延时(希望官方支持这个功能) 为了实现这个功能,网上查询了不少资料,查询到不少相关的文章,主要…
上图是通过RocketMQ源码分析一个实现原理方案示意图. 分为两个部分: 消息的写入消息的Schedule 在写入CommitLog之前,如果是延迟消息,按照每10分钟写入delayfile文件,对于快到时间执行的,直接写入时间轮,并且写入delayfile,时间轮每秒钟执行,如果时间到了,就执行队列中的任务,写入commitlog文件中,commitlog会自动写入 comsumqueue中,然后客户端就能消费到了. 为什么delayfile文件保存10分钟的数据呢,考虑到时间轮不能太多任务…
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…
时间轮和秒级文件实现原理图 这种方案比较简单实现,通过秒级时间,建立对应的文件夹,只要相同的时间超时的消息,就在同一个目录,通过msgid保证文件不重复,等到了时间后,就扫描对应的文件夹的文件,发送到队列中,写入commitlog即可. 当然了,我们可以先缓冲一定时间的文件夹文件,这样效率高一些. 我也开发这种方案的实现(简易版本),在测试环境跑了2周,(测试了每秒5000条延时消息)暂时没有问题,说明对于延迟消息不大的情况下,这个方案最简单,也是不错的选择…
简单的来说,就是rocketmq发送消息到broker的时候,判断是否定时消息, 如果是定时消息,将消息发送到代理服务(这个是一个独立的服务,需要自己开发,定时地把消息发送出去), 当然了消息用什么来保存呢?可以是数据库,redis等等,不过我推荐采用文件,因为消息可能会比较多,需要保存一定的时间,可以考虑RocksDB,这个效率非常的高效. 用什么来通信呢,我觉得 netty 比较好,当然了http也是可以的. 这种方式实现的好处是,不需要修改rocketmq服务端,修改发送消息的mq客户端就…
这是一篇分享文 转自:http://www.cnblogs.com/williamjie/p/9481780.html  尊重原作,谢谢 消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: 小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑.再不然就是和运营聊聊天,写几个SQL,生成下报表.又或者接到客服的通知,某某功能故障了,改改数据,然后下班部署上线.每天过的都是这种生活,技术零成长. 小B,工作于某国企,虽然能接触到一些中间件技术.…