2.2.2 消息队列

消息队列 #

ZeroMQ 和 RabbitMQ/Kafka 不同,它只是一个异步消息库,在套接字的基础上提供了类似于消息代理的机制。使用 ZeroMQ 的话,需要对自己的业务代码进行改造,不利于服务解耦。

RabbitMQ 支持 AMQP(二进制),STOMP(文本),MQTT(二进制),HTTP(里面包装其他协议)等协议。Kafka 使用自己的协议。

Kafka 自身服务和消费者都需要依赖 Zookeeper。

RabbitMQ 在有大量消息堆积的情况下性能会下降,Kafka 不会。毕竟 AMQP 设计的初衷不是用来持久化海量消息的,而 Kafka 一开始是用来处理海量日志的。

在同步发送场景中,三个消息中间件的表现区分明显:

  • Kafka 的吞吐量高达 17.3w/s,不愧是高吞吐量消息中间件的行业老大。这主要取决于它的队列模式保证了写磁盘的过程是线性 IO。此时 broker 磁盘 IO 已达瓶颈。
  • RocketMQ 也表现不俗,吞吐量在 11.6w/s,磁盘 IO % util 已接近 100%。RocketMQ 的消息写入内存后即返回 ack,由单独的线程专门做刷盘的操作,所有的消息均是顺序写文件。
  • RabbitMQ 的吞吐量 5.95w/s,CPU 资源消耗较高。它支持 AMQP 协议,实现非常重量级,为了保证消息的可靠性在吞吐量上做了取舍。我们还做了 RabbitMQ 在消息持久化场景下的性能测试,吞吐量在 2.6w/s 左右。

在服务端处理同步发送的性能上,Kafka > RocketMQ > RabbitMQ。

参考:


常见消息队列实现 #

apache/kafka

Github stars #

apache/rocketmq

Github stars #

阿里 RocketMQ 是站在巨人的肩膀上(kafka)

rabbitmq/rabbitmq-server

Github stars #

apache/activemq

Github stars #


ZeroMQ #

zeromq/libzmq

Github stars #

ZeroMQ core engine in C++, implements ZMTP/3.1

zeromq/jeromq

Github stars #

Pure Java ZeroMQ

zeromq/netmq

Github stars #

A 100% native C# implementation of ZeroMQ for .NET

zeromq/pyzmq

Github stars #

PyZMQ: Python bindings for zeromq


参考 #