消息队列中间件存在的意义
me:我可以使用jdk内置的队列BlockQueue等来实现啊,为什么要用消息中间件呢?
同事:内置的队列确实可以满足一些需求,可是如果是重要不允许丢失的数据。使用内置队列,在服务器宕机的时候,内置队列的消息是不是会丢失呢?
me:确实会丢失,但可以用redis来保证数据丢失问题,redis可以有实现确保数据不丢失。
同事:redis确实可以做到,但是如果你有很多业务需要使用队列。给用户推送消息,用户下单推送消息,用户注册推送消息...等等N个队列。你是不是需要在redis维护N个队列。
me:确实有点麻烦,但是可以封装一下,减少消息队列代码在原本序中的耦合。
同事:如果消息被处理失败,或者数据量是百万,千万,甚至亿万,使用redis能很好地处理吗?如果不能,你是不是要自己实现?结果就是实现不了,BUG百出?
me:确实是这样的
me:消息队列中间件就是将消息管理(消息生产,存储,路由,消费,各种模式,监控,集群支持等等)独立出来,减少代码入侵,降低耦合,增加健壮可用性。让各系统更注重自己的逻辑。
同事:理解的差不多
me:为什么有rabitmq,阿里还要开发rocketMq?
同事:为什么有淘宝,还有京东,拼多多?
rocketmq官网给出了特性
1.高压环境1毫秒响应延迟超过99.6%(这里的延迟是指消息队列响应,不包括通信响应时间(通信响应时间受网络影响))
2.财务导向,高可用的消息追踪和审计
3.万亿级别的数据堆积
4.4.1版本后,开放分布式消息传递和流标准
5.友好的大数据支持 (支持批处理,类似kafka应用的比较多)
6.积累消息不损失性能
消息中间件的对比
RocketMQ,ActiveMQ和Kafka
持久化 | 预定消息 | 批处理 | 广播 | 服务触发重新交付 | 事务 | 消息追踪 | 高可用 | ||
---|---|---|---|---|---|---|---|---|---|
RocketMQ | 磁盘 | 支持 | 支持(同步生产) | 支持 | 支持 | 支持 | 支持 | 很高 | |
ActiveMQ | 内存,文件,数据库 | 支持 | 不支持 | 支持 | 不支持 | 支持 | 不支持 | 可能依赖zK | |
Kafka | 磁盘 | 不支持 | 支持 (异步生产) | 不支持 | 不支持 | 不支持 | 不支持 | 依赖zk | |
rabitmq | 内存,文件 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 高 |
官网中提到
由于太多的队列和主题,activemq的IO遇到l了瓶颈。
得出-->
rocketmq支持上千、上万级的topic(主题)!
rocketmq吞吐量大!
参考:
https://rocketmq.apache.org/docs/motivation/ rocketmq官网
有不对的地方,希望大家提示,我会及时更正!
谢谢