一、客户端支持语言
Kafka:Java、C、C++、Erlang、.net、perl、PHP、Python、Ruby、Go、Javascript 等
rabbitmq:Java、C、C++、Python、PHP、Perl等
zeromq:Java、python、php、.net等
rocketmq:Java 、C++
activemq:Java、C、C++、Python、PHP、Perl、.net等
二、成熟度
Kafka:不成熟
rabbitmq:成熟
zeromq:不成熟
rocketmq:比较成熟
activemq:成熟
三、资料文档
Kafka:中
rabbitmq:多
zeromq:少
rocketmq:少
activemq:多
四、开发语言
Kafka:Scala和Java
rabbitmq:Erlang
zeromq:c
rocketmq:java
activemq:java
五、支持的协议
Kafka:自己定义的一套...(基于TCP)
rabbitmq:AMQP
zeromq:TCP、UDP
rocketmq:自己定义的一套...
activemq:OpenWire、STOMP、REST、XMPP、AMQP
六、消息存储
Kafka:内存、磁盘、数据库。支持大量堆积。
kafka的最小存储单元是分区,一个topic包含多个分区,kafka创建主题时,这些分区会被分配在多个服务器上,通常一个broker一台服务器。
分区首领会均匀地分布在不同的服务器上,分区副本也会均匀的分布在不同的服务器上,确保负载均衡和高可用性,当新的broker加入集群的时候,部分副本会被移动到新的broker上。
根据配置文件中的目录清单,kafka会把新的分区分配给目录清单里分区数最少的目录。
默认情况下,分区器使用轮询算法把消息均衡地分布在同一个主题的不同分区中,对于发送时指定了key的情况,会根据key的hashcode取模后的值存到对应的分区中。
rabbitmq:内存、磁盘。支持少量堆积。
rabbitmq的消息分为持久化的消息和非持久化消息,不管是持久化的消息还是非持久化的消息都可以写入到磁盘。
持久化的消息在到达队列时就写入到磁盘,并且如果可以,持久化的消息也会在内存中保存一份备份,这样可以提高一定的性能,当内存吃紧的时候会从内存中清除。非持久化的消息一般只存在于内存中,在内存吃紧的时候会被换入到磁盘中,以节省内存。
rabbitmq将非持久化消息和持久化消息保存到磁盘,是通过持久化逻辑层处理的,包含rabbit_queue_index和rabbit_msg_store两个部分,rabbit_queue_index主要存放小的消息,但是需要在内存中建立段文件。rabbit__msg_store保存大的消息,ETS表记录了消息在文件的元数据信息,通过ETS来定位消息。