联系
Knight's Blog » 工作

RabbitMq与KafKa比较

2015-04-22 16:13

==================================================================

如何保证kafka的高容错性?

  1. producer不使用批量接口,并采用同步模型持久化消息。
  2. consumer不采用批量化,每消费一次就更新offset

<table border="1" cellspacing="1" cellpadding="1"> <tr> <th width="100px"></th> <th width="100px">ActiveMq</th> <th width="150px">RabbitMq</th> <th width="150px">Kafka</th> </tr> <tr> <td width="100px"><b>producer容错,是否会丢数据<b/></td> <td width="150px"></td> <td width="150px">有ack模型,也有事务模型,保证至少不会丢数据。ack模型可能会有重复消息,事务模型则保证完全一致</td> <td width="150px">批量形式下,可能会丢数据。 非批量形式下, 1. 使用同步模式,可能会有重复数据。 2. 异步模式,则可能会丢数据。 </td> </tr> <tr> <td width="100px"><b>consumer容错,是否会丢数据<b/></td> <td width="150px"></td> <td width="150px">有ack模型,数据不会丢,但可能会重复处理数据。</td> <td width="150px">批量形式下,可能会丢数据。非批量形式下,可能会重复处理数据。(ZK写offset是异步的) </td> </tr>

<tr> <td width="100px"><b>架构模型<b/></td> <td width="150px">基于JMS协议</td> <td width="150px">基于AMQP模型,比较成熟,但更新超慢。RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding组成了消息的路由键;客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据)。rabbitMQ以broker为中心;有消息的确认机制</td> <td width="150px">producer,broker,consumer,以consumer为中心,消息的消费信息保存的客户端consumer上,consumer根据消费的点,从broker上批量pull数据;无消息确认机制。</td> </tr> <tr> <td width="100px"><b>吞吐量<b/></td> <td width="150px"></td> <td width="150px">rabbitMQ在吞吐量方面稍逊于kafka,他们的出发点不一样,rabbitMQ支持对消息的可靠的传递,支持事务,不支持批量的操作;基于存储的可靠性的要求存储可以采用内存或者硬盘。</td> <td width="150px">kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高</td> </tr> <tr> <td width="100px"><b>可用性<b/></td> <td width="150px"></td> <td width="150px">rabbitMQ支持miror的queue,主queue失效,miror queue接管</td> <td width="150px">kafka的broker支持主备模式</td> </tr> <tr> <td width="100px"><b>集群负载均衡<b/></td> <td width="150px"></td> <td width="150px">rabbitMQ的负载均衡需要单独的loadbalancer进行支持</td> <td width="150px">kafka采用zookeeper对集群中的broker、consumer进行管理,可以注册topic到zookeeper上;通过zookeeper的协调机制,producer保存对应topic的broker信息,可以随机或者轮询发送到broker上;并且producer可以基于语义指定分片,消息发送到broker的某分片上</td> </tr>

</table>

本文链接地址:RabbitMq与KafKa比较