Kafka、rabbitmq、zeromq、rocketmq、activemq综合对比(一)
总结
为了尽可能的有参考价值,只关心在生产环境中的重要特性。
Kafka/Jafka
【优势】
Kafka的优势是在超大规模数据的应用场景下体现的。
1>吞吐量极大。
a)充分利用缓冲区,发送端按批次批量发送消息,消费端按批次批量处理消息。
b)高效持久化。
c)批量刷盘。从页面缓存批量刷到磁盘。
2>动态扩展性。
支持热扩展,添加consumer、broker、producer无需关闭服务。
3>高可用、容错性、伸缩性。
4>支持同步到数据库,能与hadoop、hbase等建立数据管道。
基于磁盘的数据存储,通过建立数据管道,可以会把磁盘的消息数据同步到mysql或者hbase等数据库。
消费者可以在进行应用程序维护时离线一段时间,无需担心消息丢失或者堵塞在生产者端。
5>完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动支持负载均衡,zookeeper负责管理集群成员,搭建、部署、维护分布式集群更加简单。
每一个topic有多个分区,每一个分区有多个副本,当分区首领所在的主机发生问题的时候,kafka会自动从分区副本中选举下一个分区首领,让该分区首领的主机提供服务,分区副本的个数只需要简单配置即可,分区副本的创建和分配,不用我们去操心,负责选举的主机也是kafka选举出来的,选举哪一台主机作为控制器的过程也不用我们操心。
6>流式处理能力。
流数据是数量无限的,连续的,时序性的数据,比如游戏里物体的移动、股票交易、制造商传感器发出的事件、用户行为事件、流经交换机的网络事件等等,公司里的系统一般都包含了大量有价值的数据流。
流式处理不要求实时性达到亚毫秒级的响应,也接受不了要等到第二天才知道结果,基于批处理和实时处理之间。
kafka很多基于Kafka构建的流式处理系统都将kafka作为唯一可靠的数据来源。
a)kafka支持两个基于流的API,一个是底层的Processor API,一个是高级的Stream DSL。
b)kafka0.10.0和更高的版本可以记录时序信息。
kafka的生产者会自动在记录中添加记录的创建时间。
kafka会记录日志追加时间,日志追加时间是指事件保存到broker的时间,如果启用了自动添加时间戳的功能,那么broker会在接收这些记录的时候自动添加时间戳。
【劣势】
1>不支持消息重试,注意区分消息重传!消息消费失败后,把错误记录下来?把消息保存到磁盘上?回调另一个程序?具体哪一种逻辑是由我们决定的,比如发生异常时在catch代码块中加入到死信队列,消息可能丢失(消息来不及处理就宕机了,或者代码逻辑的疏忽)。