消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋、日志处理四大场景,实现高性能,高可用,可伸缩和最终一致性架构。使用较多的消息队列有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ等。
一、常见问题
- RabbitMQ消费脚本常驻进程
- RabbitMQ平滑重启
- RabbitMQ延时消费
- RabbitMQ消费模式(Push & Pull)
- RabbitMQ连接安全性保证【用户管理、角色管理、权限管理】
- RabbitMQ的vhost实现大量短信短时间发送完
二、连接
三、Kafka-RabbitMQ-RocketMQ对比
-
- Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件,由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。
- 特色
- 支持Java消息服务(JMS) 1.1 版本
- Spring Framework
- 集群(Clustering)
- 支持的编程语言包括:C、C++、C#、Delphi、Erlang、Adobe Flash、Haskell、Java、JavaScript、Perl、PHP、Pike、Python和Ruby
- 协议支持包括:OpenWire、REST、STOMP、WS-Notification、MQTT、XMPP以及AMQP
-
RocketMQ是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给Apache基金会,并于2016年11月成为 Apache 孵化项目。它是一个分布式、队列模型的消息中间件,并支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。
- 它里面有几个区别于标准消息中件间的概念,如Group、Topic、Queue等,系统组成则由Producer、Consumer、Broker、NameServer等。
- 具有以下特点:
- 能够保证严格的消息顺序
- 提供丰富的消息拉取模式
- 高效的订阅者水平扩展能力
- 实时的消息订阅机制
- 亿级消息堆积能力
特色
- 支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型
- 在一个队列中可靠的先进先出(FIFO)和严格的顺序传递(RocketMQ可以保证严格的消息顺序,而ActiveMQ无法保证)
- 支持拉(pull)和推(push)两种消息模式
- Push好理解,比如在消费者端设置Listener回调
- Pull控制权在于应用,即应用需要主动的调用
- 拉消息方法从Broker获取消息,这里面存在一个消费位置记录的问题,如果不记录,会导致消息重复消费
- 单一队列百万消息的堆积能力,RocketMQ提供亿级消息的堆积能力,且依然能保持写入低延迟
- 支持多种消息协议,如JMS、MQTT等
- 分布式高可用的部署架构,满足至少一次消息传递语义
- 提供docker镜像用于隔离测试和云集群部署
- 提供配置、指标和监控等功能丰富的Dashboard
相比其他MQ的优势
- 支持事务型消息(消息发送和DB操作保持两方的最终一致性,rabbitmq和kafka不支持)
- 支持结合rocketmq的多个系统之间数据最终一致性(多方事务,二方事务是前提)
- 支持18个级别的延迟消息(rabbitmq和kafka不支持)
- 支持指定次数和时间间隔的失败消息重发(kafka不支持,rabbitmq需要手动确认)
- 支持consumer端tag过滤,减少不必要的网络传输(rabbitmq和kafka不支持)
- 支持重复消费(rabbitmq不支持,kafka支持)
-
- Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。它是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
- 特性
- 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能
- 高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息
- 支持通过Kafka服务器和消费机集群来分区消息
- 支持Hadoop并行数据加载
-
- RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
- 特性
- 集群服务
- 消息持久化
- 消息确认机制
- RabbitMQ实现了AMQP标准的消息服务器
- 高并发,使用了Erlang开发语言,它是为电话交换机开发的语言,天生自带高并发和高可用特性
- 社区活跃度高
对比
特性 \ MQ | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
开发语言 | java | erlang | java | scala |
单机吞吐量 | 万级 | 万级 | 10万级 | 10万级 |
时效性 | ms级 | us级 | ms级 | ms级以内 |
可用性 | 高(主从架构) | 高(主从架构) | 非常高(分布式架构) | 非常高(分布式架构) |
功能特性 | 成熟的产品,在很多公司得到应用;有较多的文档;各种协议支持较好 | 基于erlang开发,所以并发能力很强,性能极其好,延时很低;管理界面较丰富 | MQ功能比较完备,扩展性佳 | 只支持主要的MQ功能,像一些消息查询,消息回溯等功能没有提供,毕竟是为大数据准备的,在大数据领域应用广。 |