队列消息传递/消费者组的工作流?

unguejic  于 2021-06-08  发布在  Kafka
关注(0)|答案(3)|浏览(347)

假设我有一个消费群体g1,它有三个消费群体c1,c2和c3。所有人都订阅主题1,该主题只有一个分区。现在producer在partition1上生成3条消息,broker将向每个使用者移交1条消息。正确的?
但我在看了下面粗体字的部分后感到困惑 Workflow of Queue Messaging / Consumer Group Kafka教程
单个消费者订阅特定主题,假设“topic-01”和“group-id”为“group-1”。
kafka与消费者的交互方式与pub-sub消息传递的方式相同,直到新消费者使用与“group-1”相同的“group id”订阅相同的主题“topic-01”。
一旦新的消费者到达,Kafka将其操作切换到共享模式,并在两个消费者之间共享数据。这种共享将一直持续,直到使用者的数量达到为特定主题配置的分区的数量为止。
一旦使用者的数量超过分区的数量,新使用者将不会收到任何进一步的消息,直到任何一个现有使用者取消订阅。出现这种情况是因为kafka中的每个使用者将被分配至少一个分区,并且一旦所有分区都被分配给现有使用者,新的使用者将不得不等待。
如果按点3/4,只有consumer1会得到所有消息,因为consumer的数量(3)大于partition的数量(1)?这是否意味着我需要在所有的3个分区中创建3个分区,而组g1将订阅所有3个分区,以便每个使用者每个都获得一条消息?

wmomyfyw

wmomyfyw1#

Kafka提供了两种不同的交付模式:
竞争/消费者:当消费者在同一个消费者组中从某个主题接收信息时,该主题中的每个分区都被分配给一个且只有一个消费者。这意味着,如果使用者多于分区,则剩余的使用者将处于空闲状态而不接收消息。在您的示例中,只有一个分区将只分配给一个使用者,而该使用者将是唯一接收消息的使用者;其他消费者将无所事事。分区的数量根据使用者定义了并行性。
发布/订阅:当使用者属于不同的使用者组时,他们将收到相同的消息(正如在messagebroker的主题/子脚本中发生的那样)

ncecgwcz

ncecgwcz2#

如果按点3/4,只有consumer1会得到所有消息,因为consumer的数量(3)大于partition的数量(1)
对。它可能是三个中的任何一个。
这是否意味着我需要在所有的3个分区中创建3个分区,而组g1将订阅所有3个分区,以便每个使用者每个都获得一条消息?
是的,如果您的主题有3个或更多分区,那么所有3个使用者都将从您的主题开始消费。

jv4diomz

jv4diomz3#

让我们检查一下这个系统经过验证的实际工作流程:
生产者定期向主题发送消息。
kafka将所有消息存储在为该特定主题配置的分区中,类似于前面的场景。
单个消费者订阅特定主题,假设“topic-01”,组id为“group-1”。
kafka与消费者的交互方式与pub-sub消息传递的方式相同,直到新消费者使用与“group-1”相同的组id订阅相同的主题“topic-01”。
一旦新的消费者到达,Kafka将其操作切换到共享模式,并在两个消费者之间共享数据。这种共享将一直持续,直到消费者的数量达到为特定主题配置的分区数量。
一旦使用者的数量超过分区的数量,新使用者将不会收到任何进一步的消息,直到任何一个现有使用者取消订阅。出现这种情况是因为kafka中的每个使用者将被分配至少一个分区,并且一旦所有分区都被分配给现有使用者,新的使用者将不得不等待。
此功能也称为消费群。同样,Kafka将以一种非常简单有效的方式提供这两种系统中最好的。
(我不想获得任何荣誉,请将他的荣誉授予tutorialspoint:https://www.tutorialspoint.com/apache_kafka/apache_kafka_workflow.htm)

相关问题