Kafka是基于partition
的模型,在消费的时候,消费者会和kafka建立一个绑定的关系。假设有一个topic
有3个partition
:P1,P2,P3,同时有一个消费group对应有3个消费者:C1,C2,C3,则消费会建立一个P1-C1,P2-C2,P3-C3的关系。
如果消费者数量多于partirion
的话,就会有消费者空闲。
而如果partition个数比consumer个数多,则有可能导致有的消费者存在比其他消费者多的情况:
所以,kafka的最合理的分配机制是partition
与consumer的成倍数关系,而且一个partition只能被一个消费者消费。
交代了Kafka的基本模型,下面再说几个疑问:
答
:
—————————–
Topic
中一个partition
每次被消费的时候,会记录一个消费的进度,用术语来说是offset(位移)
。
假设一个Topic中有10条消息,被消费者A消费了2条,则消费者A对应的offset的为2。如果这个时候有一个消费者B想从头消费,又不影响消费者A的消费offset,这个时候就需要引入一个消费组的概念。
对于为什么一个partition只能被一个消费组里的一个消费者消费,可能就是为了保证有序性,网上也查了点资料:
相比传统的消息系统,Kafka可以很好的保证有序性。 传统的队列在服务器上保存有序的消息,如果多个consumers同时从这个服务器消费消息,服务器就会以消息存储的顺序向consumer分发消息。虽然服务器按顺序发布消息,但是消息是被异步的分发到各consumer上,所以当消息到达时可能已经失去了原来的顺序,这意味着并发消费将导致顺序错乱。为了避免故障,这样的消息系统通常使用“专用consumer”的概念,其实就是只允许一个消费者消费消息,当然这就意味着失去了并发性。
在这方面Kafka做的更好,通过分区的概念,Kafka可以在多个consumer组并发的情况下提供较好的有序性和负载均衡。将每个分区分只分发给一个consumer组,这样一个分区就只被这个组的一个consumer消费,就可以顺序的消费这个分区的消息。因为有多个分区,依然可以在多个consumer组之间进行负载均衡。注意consumer组的数量不能多于分区的数量,也就是有多少分区就允许多少并发消费。
Kafka只能保证一个分区之内消息的有序性,在不同的分区之间是不可以的,这已经可以满足大部分应用的需求。如果需要topic中所有消息的有序性,那就只能让这个topic只有一个分区,当然也就只有一个consumer组消费它
(本文完)
作者:付威 博客地址:http://blog.laofu.online 如果觉得对您有帮助,可以下方的RSS订阅,谢谢合作 如有任何知识产权、版权问题或理论错误,还请指正。 本文是付威的网络博客原创,自由转载-非商用-非衍生-保持署名,请遵循:创意共享3.0许可证 交流请加群113249828: 点击加群 或发我邮件 laofu_online@163.com