Kafka事务流由基础到实践
消费者在内部维护一个偏移量,该偏移量指向分区中的下一个记录,从而在每次连续读取时都增加偏移量。消费者首次订阅主题时,可以选择从主题的头端或尾端开始。通过将auto.offset.reset属性设置为latest, earliest 或者none,可以控制这个行为。在后一种情况下,如果消费者组不存在先前的偏移量,则将触发异常。 消费者在本地保留其偏移状态向量。由于不同消费组中的消费者不会互相干扰,因此可能有许多人同时阅读同一主题。消费者按照自己的偏移读取消息;缓慢的或积压的消费者对其同组其他人也不会有影响。 为了说明这个概念,我们考虑一个包含两个分区的主题为场景。两个消费者组-A和B-订阅了该主题。每个组具有三个实例,使用者被命名为A1,A2,A3,B1,B2和B3。下图说明了两组如何共享主题,以及消费者如何彼此独立地浏览记录。 ![]() 仔细看上图,会发现缺少某些东西。消费者A3和B1不在上图中。这是因为Kafka保证分区只能分配给其消费组中的一个消费者。由于每个组中有三个消费者,但是只有两个分区,因此一个消费者将保持空闲状态,等待其所在组中的另一个消费者离开。以这种方式,消费组不仅是负载平衡机制,而且还是用于建立高性能管道而又不牺牲安全性的类似栅栏的排他性控制,特别是在要求只能由一个线程处理记录的情况下或在任何给定时间进行处理。 消费组也用于确保可用性。通过定期从主题中提取记录,消费者可以向集群隐式反馈集群为"健康"状态,从而将租约扩展到其分区分配上。但是,如果消费者未能在允许的期限内再次阅读,则将其视为有缺陷,并且将重新分配其分区,分配给该组中其余的"健康"消费者。该截止日期由max.poll.interval.ms在消费者客户端属性控制,默认情况下设置为五分钟。 用交通系统来做个类比,主题就像是高速公路,分区就是车道。记录就是等同于汽车,其乘客对应于记录值。只要保持行车路线,几辆车就可以安全地在同一条高速公路上行驶。共享相同线路的汽车按顺序行驶,形成队列。现在,假设每条车道通向一个匝道,将其流量转移到某个位置。如果一个匝道堆积了,其他匝道可能仍能顺畅流动。 Kafka正是利用这种机制确保端到端的吞吐量,轻松地实现每秒达到数百万条记录的QPS。创建主题时,可以选择分区计数,通道数。分区在一个消费组中的各个消费者之间大致均匀地划分,并确保不会将分区同时分配给两个(或多个)消费者。 注意:创建后,可以通过增加分区数来调整主题的大小。但是,无法在不重新创建主题的情况下减少分区数。 (编辑:西安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |