消息队列 #
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 #
apache/rocketmq #
阿里 RocketMQ 是站在巨人的肩膀上(kafka)
rabbitmq/rabbitmq-server #
apache/activemq #
ZeroMQ #
zeromq/libzmq #
ZeroMQ core engine in C++, implements ZMTP/3.1
zeromq/jeromq #
Pure Java ZeroMQ
zeromq/netmq #
A 100% native C# implementation of ZeroMQ for .NET
zeromq/pyzmq #
PyZMQ: Python bindings for zeromq
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。