一言蔽之
kafka诞生于LinkedIn,是其贡献的分布式高性能消息引擎服务【MQ】(如今其定位为一个分布式流处理平台)
消息引擎系统
-
消息引擎系统EMS:企业以一套标准消息规范屏蔽不同系统的差异,传递准确语义消息。
-
设计因素:
- 消息设计:结构 xml、json、file、binary
- 传输协议:http、rpc、binary
-
消息引擎范式
- 消息队列:点对点
- 发布订阅:一对多
- java 消息服务:jms,作为api规范,提供很多接口实现用于实现分布式系统消息传递。大部分主流mq支持,kafka则没完全遵循。另辟蹊径。
- 消息队列:点对点
设计概要
吞吐量/延时
:- 对于kafka而言,吞吐量就是每秒能处理的消息数目或者字节数
- 页缓存
- io交给os
- 零拷贝sendfile
- 追加写入日志,避免磁盘随机写寻址(高速
固态与非固态顺序写和随机写
- 延时表示客户端发起请求与服务器处理并响应给客户端的这段时间
- micro-batch实现低延迟高吞吐
- 对于kafka而言,吞吐量就是每秒能处理的消息数目或者字节数
消息持久化
:- 解耦消息发送和消费
- 实现灵活消息处理,消息重演
负载均衡和故障转移
:- 负载均衡, producer->topic(key hash)partition->consumer group均衡消费
- 故障转移,容错:
- 集群controller 依靠zk,处理broker(isr)
- consumer重平衡(随机,轮询,sticky)
- 旧版本依赖zk
- 新版本依赖group Coordinator
- 负载均衡, producer->topic(key hash)partition->consumer group均衡消费
伸缩性
:- zk轻量级状态维护,元数据(topic,partition信息等)更新
- kafka consumer注册的watcher就能感知所消费的partition列表和发现broker
- broker用zk来注册broker以及监听分区leader存活
- zk轻量级状态维护,元数据(topic,partition信息等)更新
kafka基本术语
- 消息
- 二进制消息
- bytebuffer+页缓存
- topic和partition:topic-partition-message
- 业务消息,topic代表一类消息,是个逻辑概念
- partition可以理解成有序消息日志(夹着这一层提高吞吐
- offset
- kafka本质就是一个消息tuple(三元组)-> <tioic,partition,offset>
- replica
- partition副本
- leader和follower:区别传统主备(mysql读写分离都提供服务),此类leader唯一对外服务,其余被动追随
- 副本分为领导者
- 追随者
- ISR:in-sync replica
- isr集合:所有replica同步leader
- 交付语义:所有replica收到同一条消息,才算已提交
- isr动态调整:由于各种原因,replica消息滞后,isr踢出,replica重新追上leader,纳入isr
应用场景 | FAQ |
---|---|
网站行为日志追踪 | 用户行为都可以以消息形式发到kafka,用于行为分析或者优化网站 |
审计数据收集 | 运维监控 |
日志收集 | 企业分布式跨部门多应用产生日志,可以统一通过kafka输送到下游如hdfs |
Event Sourcing | 用事件序列表示状态变更,【DDD领域驱动】。 |
流式处理 | 纯净,轻应。对标【flink storm spark streaming】。应用于以kafka为系统总线的场景,此场景下,相比spark stream减少kafka消息拆分再组装的一些额外开销。 |
By mori.wang
vipshop.fcs
2019