消息中间件--01. Kafka的几个疑问

付威     2020-02-09   1354   3min  

Kafka是基于partition的模型,在消费的时候,消费者会和kafka建立一个绑定的关系。假设有一个topic有3个partition:P1,P2,P3,同时有一个消费group对应有3个消费者:C1,C2,C3,则消费会建立一个P1-C1,P2-C2,P3-C3的关系。

Kafka的文件机制

如果消费者数量多于partirion的话,就会有消费者空闲。

Kafka的文件机制

而如果partition个数比consumer个数多,则有可能导致有的消费者存在比其他消费者多的情况:

Kafka的文件机制

所以,kafka的最合理的分配机制是partition与consumer的成倍数关系,而且一个partition只能被一个消费者消费。

交代了Kafka的基本模型,下面再说几个疑问:

  1. 一个Consumer是什么意思,一个线程还是进程?
  2. 消费组是什么含义?
  3. 为什么一个partition不能被多个Consumer消费?

  1. 一个Consumer是一个消费者实例,可以是一个线程,也可以是一个进程,可以理解成一个客户端。一个客户端可以是一个单独的进程,也可以个开多个线程调用的一个客户端实例。

  2. 个人觉得消费组的引入是能让消息更通用化的消费,通俗的来说,一个消息的Topic中一个partition每次被消费的时候,会记录一个消费的进度,用术语来说是offset(位移)

    假设一个Topic中有10条消息,被消费者A消费了2条,则消费者A对应的offset的为2。如果这个时候有一个消费者B想从头消费,又不影响消费者A的消费offset,这个时候就需要引入一个消费组的概念。

  3. 对于问题3,也想了很久,如果在不考虑顺序的话,kafka完全可以多个消费者消费一个partition,而且与现在的kafka的机制并不违背。

对于为什么一个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

付威

获得最新的博主文章,请关注上方公众号