@
humpy 谢谢回复!我猜测在实际业务中,可以将 topic 理解为一个抽象的消息组,partition 才是最终的消息容器,这样对吗?比如有需要收集埋点数据的业务,那么“埋点数据”可以作为一个 topic,不同客户端可以通过各自指定的 key 将消息发送给 topic 的指定分区,例如在埋点数据 topic 中可能有“web 端”、“android 端”、“ios 端”这样的 key 组成的 partition,这样对吗?
至于消费者组对一个 topic 的消费,其组内和 partition 之间是点对点一对一的。如果按照上面将 kafka 的 partition 理解为*同类消息*最终落地的地方,那么在消费者组内只有一个业务服务可以消费这个 partition 。例如在上面例子中“web 端 partition”需要一个“web 数据 consumer”来消费,以此类推,就有下面这样的结对:
- “web 埋点 partition”:“ web 数据 consumer”
- “android 埋点 partition”:“android 数据 consumer”
- “iOS 埋点 partition”:“ios 数据 consumer”
上面 partition 和 consumer 点对点的消费数据,web 、android 、ios 三个 consumer 组成了一个消费者组,这样这个消费者组内如果有多个消费者,那这些消费者就得是*不同的业务服务*组成的。如果在负载均衡的场景中,多个相同服务副本需要在不同的消费者组中才能对同一 topic 的同一 partition 同时消费。这样的理解对吗?那么再概况一下,消费者组可以理解为“某个大业务需求的细分实现服务组”,对吗?
但我感觉我的理解不太对。如果是上面这样的话,Kafka 为什么会通过 RoundRobin 或 range 的模式为 consumer 分配多个 partition 呢?为某个业务消费者分配多个不同的业务业务消息本身就是冲突的地方。所以感觉还是对 Kafka 的实际实践一头雾水。