0

我有一个关于在 kafka 中发布和读取消息的方式的问题,用于微服务架构,具有相同微服务的多个实例用于写入和读取。我的主要问题是发布和读取的微服务配置了自动缩放,但默认实例数为 1。

关键是我有一个实体,我们称之为存储在 DDBB 中的“事件”,每个实体在 DDBB 中都有自己的 ID。当在特定实体中执行某些特定命令时(比如说 entityID = ajsha87),它必须发布一条消息,供消费者阅读。如果同一实体的每条消息都写在不同的分区中并同时使用(并发问题),我会遇到很多问题。

我的问题是,例如,我是否可以根据 entityID 设置该特定实体的所有事件将在哪些分区中发布。对于具有不同 ID 的另一个实体,我不关心分区,但同一实体的消息必须始终发布在同一个分区中,以避免消费者读取消息 (1) 之后发布的消息 (2)。有什么机制可以做到这一点,或者每次我保存我随机存储在 DDBB 中的实体时,它的消息将在其中发布的分区 ID?

消费者也是如此。只有一个消费者可以同时读取一个分区,因为如果不是,一个消费者号 1 可以从分区 (1) 中读取消息 (1) 与实体 (ID=78198) 相关联,然后另一个可以读取消息 (2) 从分区(1)与同一实体相关,并处理第一个之前的消息 2。

根据微服务自动缩放,每个实例只订阅一个分区有什么机制吗?

另一种选择是为每个新发布者实例动态分配一个分区,但我不知道如何动态配置它以根据微服务实例设置不同的分区 ID

顺便说一句,我正在使用弹簧靴

感谢您的回答和建议,如果我的英语不够好,请见谅。

4

1 回答 1

2

如果您Hash Partitioner在生产者配置中用作分区器(这是许多库中的默认分区器),并对同一个实体使用相同的密钥(比如说 entityID = ajsha87),kafka 会设法将具有相同密钥的所有消息发送到同一个分区。

如果您使用的是组消费者,则一个消费者实例负责一个分区,并且发布到该分区的所有消息仅由该实例使用。如果在升级时有重新平衡,则可以更改实例。但仍然会从一个消费者实例中读取同一分区中的消息。

于 2021-05-06T14:26:16.003 回答