首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >消息中间件--01. Kafka的几个疑问

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

作者头像
付威
发布2020-02-18 16:28:29
2790
发布2020-02-18 16:28:29
举报

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

Kafka的文件机制
Kafka的文件机制

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

Kafka的文件机制
Kafka的文件机制

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

Kafka的文件机制
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 如有任何知识产权、版权问题或理论错误,还请指正。 本文是付威的网络博客原创,自由转载-非商用-非衍生-保持署名,请遵循:创意共享3.0许可证

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 上面几个问题,有的却是很低级,但是却是不弄清楚就是层窗户纸。
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档