Kafka 设计与理解

整体架构 图片来自 https://zhuanlan.zhihu.com/p/103249714 Producer 负责发布消息到Kafka broker。Producer发送消息到broker时,会根据分区策略选择将其存储到哪一个Partition。 常规的有轮询,随机等策略,主要是为了将消息均衡的发送到各个 partition,提高并行度,从而提高吞吐。常用的还有按 key 哈希,主要是为了实现业务 partition 有序的需求。 Consumer 消息消费者,从Kafka broker读取消息的客户端。 Consumer Group Consumer Group是Kafka提供的可扩展且具有容错性的消费者机制,每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。 Consumer Group下可以有一个或多个Consumer实例。这里的实例可以是一个单独的进程,也可以是同一进程下的线程。 Group ID是一个字符串,在一个Kafka集群中,它标识唯一的一个Consumer Group。 Consumer Group下所有实例订阅的主题的单个分区,只能分配给组内的某个Consumer实例消费。 进度提交 消费者在消费的过程中需要记录自己消费了多少数据,即消费位置信息。在Kafka中,这个位置信息有个专门的术语:位移(Offset)。 Rebalance 何时触发 rebalance 组成员数量发生变化,有新成员加入,或者有成员实例崩溃退出。 订阅主题数量发生变化:Consumer Group可以使用正则表达式的方式订阅主题,比如果consumer.subscribe(Pattern.compile(“t.*c”))就表明该Group订阅所有以字母t开头、字母c结尾的主题。在Consumer Group的运行过程中,你新创建了一个满足这样条件的主题,那么该Group就会发生Rebalance 订阅主题的分区数发生变化,如主题扩容。 Rebalance本质上是一种协议,规定了一个Consumer Group下的所有Consumer如何达成一致,来分配订阅Topic的每个分区Topic的每个分区。 比如某个Group下有20个Consumer实例,它订阅了一个具有100个分区的Topic。正常情况下,Kafka平均会为每个Consumer分配5个分区。这个分配的过程就叫Rebalance。 Rebalance 的流程 在消费者端,重平衡分为两个步骤:分别是 加入组 和 等待领导消费者(Leader Consumer)分配方案。这两个步骤分别对应两类特定的请求:JoinGroup请求和SyncGroup请求。 当组内成员加入组时,它会向 协调者 发送JoinGroup请求(后面会介绍协调者)。在该请求中,每个成员都要将自己订阅的主题上报,这样协调者就能收集到所有成员的订阅信息。一旦收集了全部成员的JoinGroup请求后,协调者会从这些成员中选择一个担任这个消费者组的领导者。 通常情况下,第一个发送JoinGroup请求的成员自动成为领导者。你一定要注意区分这里的领导者和之前我们介绍的领导者副本,它们不是一个概念。这里的领导者是具体的消费者实例,它既不是副本,也不是协调者。领导者消费者的任务是收集所有成员的订阅信息,然后根据这些信息,制定具体的分区消费分配方案。 选出领导者之后,协调者会把消费者组订阅信息封装进JoinGroup请求的响应体中,然后发给领导者,由领导者统一做出分配方案后,进入到下一步:发送SyncGroup请求。 在这一步中,领导者向协调者发送SyncGroup请求,将刚刚做出的分配方案发给协调者。值得注意的是,其他成员也会向协调者发送SyncGroup请求,只不过请求体中并没有实际的内容。这一步的主要目的是让协调者接收分配方案,然后统一以SyncGroup响应的方式分发给所有成员,这样组内所有成员就都知道自己该消费哪些分区了。 JoinGroup请求的主要作用是将组成员订阅信息发送给领导者消费者,待领导者制定好分配方案后,重平衡流程进入到SyncGroup请求阶段。 SyncGroup请求的主要目的,就是让协调者把领导者制定的分配方案下发给各个组内成员。当所有成员都成功接收到分配方案后,消费者组进入到Stable状态,即开始正常的消费工作。 正常情况下,每个组内成员都会定期汇报位移给协调者。当重平衡开启时,协调者会给予成员一段缓冲时间,要求每个成员必须在这段时间内快速地上报自己的位移信息,然后再开启正常的JoinGroup/SyncGroup请求发送。 Broker Kafka集群包含一个或多个服务器,这种服务器被称为broker。一个 broker 可以容纳多个 topic。brocker 是 kafka 中的核心组件,负责消息的存储,分区,路由信息的管理等。...

May 2, 2021 · 2 min · 徐旭