Kafka是一个分布式的基于发布/订阅模式消息队列(Message Queue,MQ),主要应用于大数据实时处理领域。

MQ(Message Queue)

1.Kafka基本概念 - 图1

消息模型

消息模式 特点
点对点(point to point, queue)
- 发送到队列中的消息被一个而且仅仅一个接收者所接收,即使有多个接收者在同一个队列中侦听同一消息;
- 一般基于Pull或者Polling接收消息;
- 即支持异步“即发即弃”的消息传送方式,也支持同步请求/应答传送方式(保证每条消息被成功处理);
发布/订阅(publish/subscribe,topic)
- 发布一个主题的消息,可被多个订阅者所接收;
- 即可基于Push消费数据,也可基于Pull或者Polling消费数据;
- 消息一般会持久化,可反复消费。

1.jpg2.jpg

适用场景

  • 解耦:各个系统之间通过消息系统统一接口交换数据。
  • 冗余:部分消息系统具有消息持久化能力,可规避消息处理前丢失的风险。
  • 扩展:消息系统是统一的数据接口,各系统可独立扩展。
  • 削峰:消息系统可顶住峰值流量,业务系统可根据处理能力从消息系统中获取并处理对应量的请求。
  • 可恢复性:系统中部分组件失效并不会影响整个系统,它恢复后仍然可从消息系统中获取并处理数据。
  • 异步:在不需要立即处理请求的场景下,可以将请求放入消息系统,合适的时候再处理。

    MQ对比

    | 特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka | | —- | —- | —- | —- | —- | | 单机吞吐量 | 万级,比 RocketMQ、Kafka 低一个数量级 | 同ActiveMQ | 10万级,支撑高吞吐 | 10万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景 | | topic数量对吞吐量的影响 | 无topic概念(queue) | 无topic概念(queue) | topic可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是RocketMQ的一大优势,在同等机器下,可以支撑大量的topic | topic从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka尽量保证topic数量不要过多,如果要支撑大规模topic,需要增加更多机器资源 | | 时效性 | ms级 | 微秒级,这是RabbitMQ 的一大特点,延迟最低 | ms 级 | 延迟在ms级以内 | | 可用性 | 高,基于主从架构实现高可用 | 同ActiveMQ | 非常高,分布式架构 | 非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用 | | 消息可靠性 | 有较低的概率丢失数据 | 基本不丢 | 经过参数优化配置,可以做到 0 丢失 | 同RocketMQ | | 功能支持 | MQ领域的功能极其完备;支持事务 | 基于erlang开发,并发能力很强,性能极好,延时很低;不支持事务 | MQ功能较为完善,还是分布式的,扩展性好;支持事务 | 功能较为简单,主要支持简单的 MQ功能,在大数据领域的实时计算以及日志采集被大规模使用;不支持事务 | | 动态扩容 | 不支持 | 不支持 | 支持 | 支持 | | 支持协议 | JMS/OpenWire、STOMP、REST、XMPP、AMQP | JMS/AMQP | 自己实现 | 仿AMQP |

基准测试:
LinkedIn团队做了个实验研究,对比Kafka与Apache ActiveMQ V5.4和RabbitMQ V2.4的性能。他们使用ActiveMQ默认的消息持久化库Kahadb。LinkedIn在两台Linux机器上运行他们的实验,每台机器的配置为8核2GHz、16GB内存,6个磁盘使用RAID10。两台机器通过1GB网络连接。一台机器作为代理,另一台作为生产者或者消费者。
生产者测试:(总共发布1000万条消息,每条消息200字节)
1.Kafka基本概念 - 图4
消费者测试:(总共获取1000万条消息)
1.Kafka基本概念 - 图5
技术实力较为一般,技术挑战不是特别高,用 RabbitMQ是不错的选择(开源的,比较稳定的支持,活跃度也高);基础架构研发实力较强,用 RocketMQ是很好的选择(阿里出品)。大数据领域的实时计算、日志采集等场景,用Kafka是业内标准的,社区活跃度很高,几乎是全世界这个领域的事实性规范

Kafka架构

producer_consumer.png
1.Kafka基本概念 - 图7
151.png

名称 解释
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内部是有序的

应用场景

Kafka主要被用于两大类应用:

  1. 建立实时流数据管道从而能够可靠地在系统或应用程序之间共享数据。
  2. 构建实时流应用程序,能够变换或者对数据进行相应的处理。

点击查看【processon】

附录

附录A:Kafka版本发布历史

① 0.7 版本,进入 Apache 孵化器
Kafka 进入 Apache 孵化器,并发布了第一个开源的版本 0.7.0。最主要的两个特征就是压缩以及
MirrorMaker,也就是跨集群之间的数据拷贝。
② 0.8 版本,提供高可用性
2012 年,Kafka 正式从孵化器里面毕业,成为 Apache 的顶级项目。同时,发布了 0.8.0并在其中加入
了高可用性,也就是基于备份的一个高可用。
③ 0.9 版本,配额和安全性
2014 年,发布了 0.8.2 和 0.9.0,在 0.9.0 这个版本里面,加入了两个非常重要的特性:配额和安全性。
④ 0.10 版本,更细粒度的时间戳
0.10 版本里,我们又加入了一个非常重要的特性,对每一个 record 会打一个具体的时间戳,这样可以
有细粒度的时间管理,并且可以基于偏移量进行快速的数据查找,找到所要的时间戳。
⑤ 1.0 & 1.1 版本,Exactly-Once 与运维性提升
具有Exactly-Once特性1.0的发布版本,是 Kafka 作为一个成熟的流数据平台的标志。