我想知道是否有任何逻辑来决定哪个使用者在同一个使用者组中读取一条消息。我有一个单一的主题,和一个单一的消费群体。但是,我有一个或多个使用者,因为在生产环境中部署了一个使用者,当我在本地运行我的应用程序时,会创建另一个客户,它订阅同一个主题(这是一个测试项目,所以它不是实际生产,我不担心数据丢失)。我注意到,有趣的是,本地消费者总是消费任何给定的信息。所以看起来,后来创建的消费者优先考虑。
是否有可能配置kafka,使先前创建的使用者优先于读取?
我的设置包括3个经纪人和1个消费者组id。此外,此属性 auto.offset.reset被设置为earliest (将其更改为latest并不能解决问题)。我用这个围棋图书馆为卡夫卡。这是我的设置代码:
import (
"log"
"github.com/confluentinc/confluent-kafka-go/kafka"
)
func getConfig() *kafka.ConfigMap {
return &kafka.ConfigMap{
"metadata.broker.list": conf.KafkaBrokers,
"security.protocol": "SASL_SSL",
"sasl.mechanisms": "SCRAM-SHA-256",
"sasl.username": conf.KafkaUsername,
"sasl.password": conf.KafkaPassword,
"group.id": conf.KafkaGroupID,
"default.topic.config": kafka.ConfigMap{"auto.offset.reset": "earliest"},
//"debug": "generic,broker,security",
}
}发布于 2021-01-09 11:29:25
在使用者组中,每个分区由单个使用者使用。当使用者加入这个组时,他们中的一个计算由每个使用者将要处理的分区的列表组成的分配。
在您的客户机中,可以通过partition.assignment.strategy对其进行配置。这默认为range,它遵循Apache的RangeAssignor的实现。
引用Javadoc:
范围分配者根据每个主题工作。对于每个主题,我们按数字顺序排列可用的分区和按字典顺序排列使用者。然后,我们将分区数除以消费者总数,以确定要分配给每个使用者的分区数。如果分配不均匀,那么前几个使用者将有一个额外的分区。 例如,假设有两个使用者( C0和C1 )、两个主题( t0和t1 ),每个主题都有3个分区,导致分区( t0p0、t0p1、t0p2、t1p0、t1p1和t1p2 )。 任务如下: C0: t0p0,t0p1,t1p0,t1p1 C1: t0p2,t1p2
使用者是根据他们的成员ID来排序的,这个ID是在代理端生成的。它是基于消费者client.id和一个随机的UUID。
在实践中,我并不在意每个分区分配给哪个使用者,所以我不会过多地关注这个部分。相反,重要的是要了解分区是如何分配的,并确定适合您的用例的策略。
为了完整起见,confluent-kafka-go还支持其他策略,如:roundrobin和cooperative-sticky。
https://stackoverflow.com/questions/65640981
复制相似问题