一文说清JMS,AMQP,ActiveMQ,RabbitMQ,Kafka,RocketMQ联系


一文说清JMS,AMQP,ActiveMQ,RabbitMQ,Kafka,RocketMQ联系文章插图
前言可能你在没学消息中间件之前都已经听过很多概念了 , JMS , AMQP , ActiveMQ , RabbitMQ , Kafka , RocketMQ , 一个消息中间件怎么能搞出怎么多概念?乱不乱啊 , 别烦 , 本文从历史的角度帮你理清这些MQ和协议之间的关系 。
一文说清JMS,AMQP,ActiveMQ,RabbitMQ,Kafka,RocketMQ联系文章插图
什么是消息中间件?消息中间件属于分布式系统中的一个子系统 , 关注于数据的发送和接收 , 利用高效可靠的消息传递机制对分布式系统中的其余各个子系统经进行集成
消息中间件的使用场景1.异步处理非核心流程异步化 , 提高系统响应性能
一文说清JMS,AMQP,ActiveMQ,RabbitMQ,Kafka,RocketMQ联系文章插图
一文说清JMS,AMQP,ActiveMQ,RabbitMQ,Kafka,RocketMQ联系文章插图
原来用户注册一下可能得依次写数据库 , 发送邮件和短信后 , 才能提示用户注册成功现在只要写数据库 , 写消息队列后就直接提示用户注册成功 , 发送邮件和短信是异步处理 , 提高了响应速度
2.应用解耦系统不是强耦合 , 消息接受者可以随意增加 , 而不需要修改消息发送者的代码 。 消息发送者的成功不依赖消息接受者
一文说清JMS,AMQP,ActiveMQ,RabbitMQ,Kafka,RocketMQ联系文章插图
rpc实现
一文说清JMS,AMQP,ActiveMQ,RabbitMQ,Kafka,RocketMQ联系文章插图
消息队列实现
如果库存系统出了问题 , 用户就不能正常下单 , 这是不合理的 。 可以通过消息队列来解耦 。 当有新的系统如广告系统对用户的订单也感兴趣的时候 , 只需要从消息队列中拿消息即可 , 订单系统完全不用改变
3.流量削峰当上下游系统处理能力存在差距的时候 , 可以用消息队列进行缓冲
一文说清JMS,AMQP,ActiveMQ,RabbitMQ,Kafka,RocketMQ联系文章插图
当有秒杀业务时 , 一下有大量请求涌入时 , 很可能造成系统瘫痪 , 此时可以用消息队列缓冲一下
4.日志处理将消息队列用在日志处理中 , 比如Kafka可以用来解决大量日志传输的问题
5.消息通讯消息队列一般都内置了高效的通信机制 , 因此也可以用于单纯的消息通讯 , 比如实现点对点消息队列或者聊天室等
消息中间件编年史
一文说清JMS,AMQP,ActiveMQ,RabbitMQ,Kafka,RocketMQ联系文章插图
1.初见曙光消息中间件其实诞生的很早 , 在互联网应用还是一片荒芜的年代 , 有个在美国的印度哥们Vivek Ranadive就设想了一种通用软件总线 , 采用发布订阅的模式 , 像主板上的总线一样供其他相应程序接入 。 他创办了一家公司Teknekron , 实现了世界上第一个消息中间件The Information Bus(TIB)
2.各自为战TIB受到了企业的欢迎 , Teknekron的业务发展引起了当时最牛气的IT公司IBM的注意 , 于是他们也开始研发了自己消息队列软件 , 于是才有了后来的wesphere mq , 微软也陆续加入了战团 。 由于商业壁垒 , 商业MQ供应商想要解决应用互通的问题 , 而不是去创建标准来实现不同MQ产品间的互通 , 或者允许应用程序更改MQ平台
3.劫制天下为了打破这个壁垒 , 同时为了能够让消息在各个消息队列平台间互融互通 ,JMS (Java Message Service) 应运而生。 JMS 试图通过提供公共 Java API 的方式 , 隐藏单独 MQ 产品供应 商提供的实际接口 , 从而跨越了壁垒 , 以及解决了互通问题 。 从技术上讲 ,Java 应用程序只需 针对 JMS API 编程 , 选择合适的 MQ 驱动即可 ,JMS 会打理好其他部分。 ActiveMQ 就是 JMS 的 一种实现。 不过尝试使用单独标准化接口来胶合众多不同的接口 , 最终会暴露出问题 , 使得 应用程序变得更加脆弱。 所以急需一种新的消息通信标准化方案。
4.一统江湖4.在 2006 年 6 月 , 由 Cisco 、 Redhat 、iMatix 等联合制定了 AMQP 的公开标准 , 由此 AMQP 登上了历史的舞台。 它是应用层协议的一个开放标准 , 以解决众多消息中间件的需求和拓扑结 构问题。 它为面向消息的中间件设计 , 基于此协议的客户端与消息中间件可传递消息 , 并不受 产品、开发语言等条件的限制。
5.合久必分LinkedIn在实现消息队列的时候觉得AMQP规范并不适合自己 , 所以Kafka并不支持AMQP协议 。 RocketMQ在实现上借鉴了Kakfa的思想 , 所以也不支持AMQP协议 , 并且你会发现在Kafka和RocketMQ中都有类似Topic和Consumer Group的概念 , 而这些概念在AMQP协议中是不存在的