一、什么是MQ?
MQ代表消息队列,是一种应用程序对应用程序的通信方法;通过消息传递队列发送和接收消息数据,支持应用程序、系统、服务和文件之间的信息交换,这简化了业务应用程序的创建和维护。
消息队列有流量削峰、应用解耦和异步通信三个作用
1.ActiveMQ
ActiveMQ 是 Apache 下的一个子项目。
优点:
单机吞吐量每秒万级,时效性毫秒级,可用性高,基于主从架构实现高可用性,消息可靠性较低的 概率丢失数据。支持多种语言、支持 Spring2 的特性、支持多种传送协议、支持通过 JDBC 和 journal 提供高 速的消息持久化。
缺点:官方社区现在的维护越来越少;社区活跃度不高。
2.Kafka
Kafka 是一个分布式消息发布订阅系统。为大数据而生的消息中间件,大数据的杀手锏
优点:
单机吞吐量每秒百万级,时效性毫秒级,不会丢失数据,不会导致不可用
缺点:支持消息顺序,但是一台代理宕机后,就会产生消息乱序;消费失败不支持重试;社区更新较慢
3.RocketMQ
RocketMQ 是阿里系下开源的一款分布式、队列模型的消息中间件,3.0 版本名称改为 RocketMQ,是阿里参照 kafka 设计思想使用 java 实现的一套消息队列。
优点:单机吞吐量十万级,时效性毫秒级,消息可以做到 0 丢失,支持 10 亿级别的消息堆积
缺点:支持的客户端语言不多,目前是 java 及 c++;社区活跃度一般;
二、RocketMQ的详解
1、RocketMQ 主要由 Producer、Broker、Consumer 三部分组成,其中 Producer 负责生产消息,Consumer 负责 消费消息,Broker 负责存储消息。
- Consumer 支持 Push 和 Pull 两种消费模式,支持集群消费和广播消费。
- Producer 支持以多种负载均衡的模式向 Broker 发送消息。
NameSever 需要独立服务部署,但是不妨碍节点互相通信构成集群。
NameSever 可以看作是轻量级的单 体服务,主要的功能:
1、管理 Broker 集群,定期发送心跳包检测 Broker 是否存在。
2、为生产者和消费者以 及 Broker 进行路由管理。 Broker 负责 Topic 和 Queue 的消息存储,支持推和拉两种模式。提供上亿级别的消息顺序消息堆积。此 外提供可视化管理平台 rocketmq-console-ng,这些都是特有功能。
流程如下:
1、NameServer 启动,Broker 进行服务注册,NameServer 需要注册所有的 Broker。
2、服务发现,连接所有的生产者和消费者,并且定时进行心跳包发送。
3、生产者发送消息之前从 NameServer 获取 Broker 的注册列表,根据负载均衡算法选出其中一台 Broker 进行 消息推送。
4、Nameserver 和 Broker 保持长连接,同时每 30S 进行一次心跳检测,如果检测到超过 120S 没有心跳,从 路由表将其删除。
5、消费者订阅某个主题前,需要先从 NameSever 查找对应的 Broker 列表或者某个集群,从 Broker 当中订阅 消息进行消费,同时由 Broker 指定订阅规则。