https://www.orchome.com/21#/collapse-1009
https://www.cnblogs.com/cjsblog/p/9664536.html
一个组中的消费者数量 <= 分区数。例如:5个消费者,10个分区,那么每个消费者会分到2个分区。如果11个消费者,10个分区,那么将有一个消费者永远分配不到分区(也就拿不到消息)
kafka处理方式不同。 我们的topic被分为一组完全有序的分区,每个分区在任何给定的时间都由每个订阅消费者组中的一个消费者消费。 这意味着消费者在每个分区中的位置只是一个整数,下一个消息消费的偏移量。 这使得关于已消费到哪里的状态变得非常的小,每个分区只有一个数字。 可以定期检查此状态。 这使得等同于消息应答并更轻量。
自0.11.0.0起,Kafka生产者支持幂等传递选项,保证重新发送不会导致日志中重复。 broker为每个生产者分配一个ID,并通过生产者发送的序列号为每个消息进行去重。从0.11.0.0开始,生产者支持使用类似事务的语义将消息发送到多个topic分区的能力:即所有消息都被成功写入,或者没有。这个主要用于Kafka topic之间“正好一次“处理(如下所述)。
那么什么是“正好一次”语义(也就是你真正想要的东西)? 当从Kafka主题消费并生产到另一个topic时(例如Kafka Stream),我们可以利用之前提到0.11.0.0中的生产者新事物功能。消费者的位置作为消息存储到topic中,因此我们可以与接收处理后的数据的输出topic使用相同的事务写入offset到Kafka。如果事物中断,则消费者的位置将恢复到老的值,根据其”隔离级别“,其他消费者将不会看到输出topic的生成数据,在默认的”读取未提交“隔离级别中,所有消息对消费者都是可见的,即使是被中断的事务的消息。但是在”读取提交“中,消费者将只从已提交的事物中返回消息。
kafka中的push和pull设计
一、生产者到broker
生产者push消息到broker,采用推模式,生产者将消息推送给消费者。
push模式的目标是尽可能以最快速度传递消息。生产者采用pull的话,不是很适合有成千上万的生产者的情况,假如生产者写入日志,broker从日志中pull,当生产者非常多,成千上万的磁盘系统并不是时时可靠的,那样大大增加了系统的复杂性。
二、broker到消费者
broker到消费者采用pull,拉模式。消费者主动到服务器拉取消息。
push模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。push模式的目标是尽可能以最快速度传递消息,但是这样很容易造成消费者来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据consumer的消费能力以适当的速率消费消息。
另外它有助于消费者合理的批处理消息。不同的消费者消费速率,外部硬件环境都不一样,交由消费者自己决定以何种频率拉取消息更合适。
基于pull模式不足之处在于,如果broker没有数据,消费者会轮询,忙等待数据直到数据到达,为了避免这种情况,我们允许消费者在pull请求时候使用“long poll”进行阻塞,直到数据到达 。
本文探讨了Kafka中消费者组、分区分配、幂等性和事务处理机制,以及push和pull设计模式的区别。阐述了消费者如何按需消费分区,生产者如何确保消息不重复,以及事务如何实现恰好一次的语义。

1976

被折叠的 条评论
为什么被折叠?



