 1.概述 ==== Apache Kafka最早是由LinkedIn开源出来的分布式消息系统,现在是Apache旗下的一个子项目,并且已经成为开源领域应用最广泛的消息系统之一。Kafka社区非常活跃,从0.9版本开始,Kafka的标语已经从“一个高吞吐量,分布式的消息系统”改为"一个分布式流平台"。 Kafka和传统的消息系统不同在于: * kafka是一个分布式系统,易于向外扩展。 * 它同时为发布和订阅提供高吞吐量 * 它支持多订阅者,当失败时能自动平衡消费者 * 消息的持久化 kafka和其他消息队列的对比:
| kafka | activemq | rabbitmq | rocketmq |
|---|---|---|---|---|
背景 | Kafka 是LinkedIn 开发的一个高性能、分布式的消息系统,广泛用于日志收集、流式数据处理、在线和离线消息分发等场景 | ActiveMQActiveMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。 | RabbitMQ是一个由erlang开发的AMQP协议(Advanced Message Queue )的开源实现。 | RocketMQ是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给Apache基金会,已经于2016年11月成为 Apache 孵化项目 |
开发语言 | java,scala | Java | Erlang | Java |
协议支持 | 自己制定的一套协议 | JMS协议 | AMQP | JMS、MQTT |
持久化支持 | 支持 | 支持 | 支持 | 支持 |
事务支持 | 0.11.0之后支持 | 支持 | 支持 | 支持 |
producer容错 | 在kafka中提供了ack配置选项, request.required.acks=-1,级别最低,生产者不需要关心是否发送成功 request.required.acks=0,只需要leader分区有了即可 request.required.acks=1,isr集合中的所有同步了才返回 可能会有重复数据 | 发送失败后即可重试 | 有ack模型 ack模型可能重复消息 事务模型保证完全一致 | 和kafka类似 |
吞吐量 | kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高 | rabbitMQ在吞吐量方面稍逊于kafka,他们的出发点不一样,rabbitMQ支持对消息的可靠的传递,支持事务,不支持批量的操作;基于存储的可靠性的要求存储可以采用内存或者硬盘。 | kafka在topic数量不多的情况下吞吐量比rocketMq高,在topic数量多的情况下rocketMq比kafka高 | |
负载均衡 | kafka采用zookeeper对集群中的broker、consumer进行管理,可以注册topic到zookeeper上;通过zookeeper的协调机制,producer保存对应topic的broker信息,可以随机或者轮询发送到broker上;并且producer可以基于语义指定分片,消息发送到broker的某分片上 |
| rabbitMQ的负载均衡需要单独的loadbalancer进行支持 | NamerServer进行负载均衡 |
名称 | 解释 |
|---|---|
Broker | 消息中间件处理节点,一个Kafka节点就是一个broker,一个或者多个Broker可以组成一个Kafka集群 |
Topic | 主题,Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic |
Producer | 消息生产者,向Broker发送消息的客户端 |
Consumer | 消息消费者,从Broker读取消息的客户端 |
ConsumerGroup | 每个Consumer属于一个特定的Consumer Group,一条消息可以发送到多个不同的Consumer Group,但是一个Consumer Group中只能有一个Consumer能够消费该消息 |
Partition | 物理上的概念,一个topic可以分为多个partition,每个partition内部是有序的 |