图解Kafka

本文介绍Kafka的架构和基本运行机制

Kafka整体架构

《图解Kafka》
《图解Kafka》
《图解Kafka》
《图解Kafka》

  • Producer:消息生产者
  • Kafka Cluster:由Broker(Server)组成,每个Broker里包含了不同Topic的不同Partition,Partition中包含了有序的消息
  • Consumer:消息消费者

Topics和Partition

  • Topics:Topic通过名字区分,Producer可以往某个Topic发送多个消息
  • 消息发送到Topic后,会被分发到多个Partition
  • 每个Partition内的消息都是有序的;每条消息在Partition里都有一个有序ID,称为offset。
    • offset仅在某个Partition中有意义。比如:Partition1中的offset=3的消息仅代表它在Partition1中排第3;它和Partition2中offset=3的消息不是同一个
    • 消息有序性:仅限在某个Partition内有序,而在Partition间不一定有序
    • Kafka中的消息仅保存一段时间,超过时间还没有被消费,则会被清除(默认保留时间为2周)
    • 消息一旦写入Partition中,消息内容就不能再被修改
    • 消息会被随机分发到Partition,除非指定了消息的key(后面会讲到)
    • 每个Topic可以包含多个Partition

《图解Kafka》

Broker

  • 一个Kafka集群由多个Broker(server)组成
  • 每个Broker都有ID标识
  • 每个Broker里保存一定数量的Partition
  • 客户端只要连接上任意一个Broker,就可以连接上整个Kafka集群
  • 大多数Kafka集群刚开始的时候建议使用至少3个Broker,集群大了可以有上百个Broker
    • 如下图,3个Broker中,保存了2个Topic的3个Partition,不同Partition在Broker里是分散存储的

《图解Kafka》
《图解Kafka》

  • 每个Topic保存在Broker里的Partition,都应该有分布式的备份(每个Partition的数量至少大于1,一般是2~3个)。有了分布式备份以后,如果一个Broker宕机了,另一个在线Broker中还能有备份数据
    • 如下图,Topic1中有2个冗余度为2的Partition:

《图解Kafka》
《图解Kafka》

    • 如果这时候Broker2宕机了,Broker1和Broker3中仍有Topic1的2个Partition的数据:

《图解Kafka》
《图解Kafka》

  • 在冗余的多个Partition中,任一时刻,只能有一个Partition为Leader,其他的Partition为Follower;只有Leader Partition可以提供数据读写服务;Follower Partition从Leader Partition中准实时地同步数据(ISR,in-sync replica)

《图解Kafka》
《图解Kafka》

Producer

  • Producer可以发送消息到Topic
    • Topic的消息存放在不同Partition中,不同Partition存放在不同Broker中
    • Producer只需要指定Topic的名字、要连接到的Broker,这样Kafka就可以自动地把消息数据路由到合适的Broker(不一定是指定连接的Broker)
  • Producer发送消息后,可以选择是否要确认消息写入成功(ACK,Acknowledgment)
    • ACK=0:Producer不会等待ACK(消息可能丢失)
    • ACK=1:Producer会等待Leader Partition的ACK(Follower Partition消息可能丢失)
    • ACK=all:Producer会等待Leader Partition和Follower Partition的ACK(消息不会丢失)

《图解Kafka》
《图解Kafka》

  • 消息key:Producer可以给消息加上key,带相同key的消息会被分发到同一个Partition,这样就可以保证带相同key的消息的消费是有序的

《图解Kafka》
《图解Kafka》

Consumer

  • Consumer可以从Topic读取消息进行消费
    • Topic的消息存放在不同Partition中,不同Partition存放在不同Broker中
    • Consumer只需要指定Topic的名字、要连接到的Broker,这样Kafka就可以自动地把Consumer路由到合适的Broker拉取消息进行消费(不一定是指定连接的Broker)
    • 每一个Partition中的消息都会被有序消费

《图解Kafka》
《图解Kafka》

  • Consumer Group:
    • Consumer Group由多个Consumer组成
    • Consumer Group里的每个Consumer都会从不同的Partition中读取消息
    • 如果Consumer的数量大于Partition的数量,那么多出来的Consumer就会空闲下来(浪费资源)

《图解Kafka》
《图解Kafka》

  • Consumer offset:
    • Kafka会为Consumer Group要消费的每个Partion保存一个offset,这个offset标记了该Consumer Group最后消费消息的位置
    • 这个offset保存在Kafka里一个名为“__consumer_offsets”的Topic中;当Consumer从Kafka拉取消息消费时,同时也要对这个offset提交修改更新操作。这样若一个Consumer消费消息时挂了,其他Consumer可以通过这个offset值重新找到上一个消息再进行处理

《图解Kafka》
《图解Kafka》

(本文图片来源于网络)

本文首发于公众号:EnjoyMoving,欢迎关注交流~

https://wx4.sinaimg.cn/mw690/73036ef6ly1fwn6kdgxm8j20c00cfmye.jpg(公众号二维码)

    原文作者:EnjoyMoving
    原文地址: https://zhuanlan.zhihu.com/p/48896367
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞