微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Boot kafka:微服务多实例、并发与分区

如何解决Spring Boot kafka:微服务多实例、并发与分区

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

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

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

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

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

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

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

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

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。