RabbitMQ
RabbitMQ 是开源的分布式消息队列系统,用 erlang 语言开发。RabbitMQ 是 AMQP 的标准实现。
AMQP(Advanced Message Queuing Protocol)高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件而设计。
AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全性。
消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
RabbitMQ 支持多种语言客户端,如:python、Ruby、.NET、Java、C、php 等,用于在分布式系统中存储转发消息,对路由、负载均衡和数据持久化都有很好的支持,是一款成熟的消息中间件。
RabbitMQ 中比较重要的几个概念:
- Producer:消息的生产者,就是生成消息将其投递(写入)到队列的程序。
- Consumer:消息的消费者,就是从队列中获取消息进行消息处理的程序。
- Broker:经纪人,就是消息队列服务器实体。
- Queue:队列,就是消息的载体,每个消息可以被投递到一个或多个队列中。
- Exchange:消息的交换机,它指定消息按什么规则,路由到哪个队列。
- Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
- Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
- Vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
- Channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
- Message acknowledgment:消息回执(消息确认)是指消费者在消费完消息后手动发送一个回执(ack)给 RabbitMQ,RabbitMQ 收到 ack 回执后,才会把消息从内存中删除(实质上是先打上删除标记,之后再删除)。
RabbitMQ 支持消息的持久化,也就是将数据保存到磁盘,为了数据安全考虑,需要进行持久化,防止 RabbitMQ 在重启或宕机后的消息丢失。
RabbitMQ 持久化包括 3 个部分:
- exchange 持久化,在声明时指定 durable => 1
- queue 持久化,在声明时指定 durable => 1
- message 持久化,在投递时指定 delivery_mode => 2(1是非持久化)
如果 exchange 和 queue 都是持久化的,那么它们之间的 binding 也是持久化的。如果 exchange 和 queue 两者之间有一个持久化,一个非持久化,就不允许建立绑定。
ActiveMQ
ActiveMQ 是 Apache 出品的、最流行的、开源的分布式消息队列系统,用 Java 语言开发。
ActiveMQ 是一个完全支持 JMS1.1 和 2EE 1.4 规范的 JMS Provider 实现。
ActiveMQ 支持多种语言客户端,如:python、Ruby、.NET、Java、C、php 等,支持数据的持久化、XA 消息和事务,是一款成熟的消息中间件。
RocketMQ
RocketMQ 是阿里巴巴出品的开源的分布式消息队列系统,用 Java 语言开发。
2016 年 11 月,阿里巴巴将 RocketMQ 捐赠给 apache。
RocketMQ 支持亿级消息堆积能力,能够撑住双十一的大流量,支持回溯消费,可以在 broker 端进行消息过滤,是一款比较成熟的消息中间件。
Kafka
Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像 Hadoop 一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka 的目的是通过 hadoop 的并行加载机制来统一线上和离线的消息处理,也是为了通过集群机来提供实时的消费。
一般应用在大数据日志处理或对实时性(少量延迟)、可靠性(少量丢数据)要求稍低的场景使用。
ZeroMQ
ZeroMQ 是一个简单好用的传输层,像框架一样的一个 socket library,它使得 Socket 编程更加简单、简洁和性能更高。它是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。
ZMQ 的明确目标是成为标准网络协议栈的一部分,之后进入 Linux 内核。
与 RabbitMQ 相比,ZMQ 并不像是一个传统意义上的消息队列服务器,事实上,它也根本不是一个服务器,更像一个底层的网络通讯库,在 Socket API 之上做了一层封装,将网络通讯、进程通讯和线程通讯抽象为统一的 API 接口。支持 Request-Reply,Publisher-Subscriber,Parallel Pipeline 三种基本模型和扩展模型。