Spring boot kafka:微服务多实例、并发和分区
Spring boot kafka: Microservice multi instances, concurrency and partitions
我有一个关于在 kafka 中发布和读取消息的方式的问题,用于具有多个相同微服务实例的微服务架构,用于写入和读取。
我这里的主要问题是发布和读取的微服务配置了自动缩放,但默认实例数为 1。
关键是我有一个实体,我们称之为“事件”,存储在 DDBB 中,每个实体在 DDBB 中都有自己的 ID。当在特定实体中执行某些特定命令时(比如 entityID = ajsha87),它必须发布一条消息,供消费者读取。如果同一实体的每条消息都写在不同的分区中并同时使用(并发问题),我会遇到很多问题。
我的问题是关于是否可以根据 entityID 例如我可以设置在哪个分区中发布该特定实体的所有事件。对于具有不同 ID 的另一个实体,我不关心分区,但同一实体的消息必须始终发布在同一分区中,以避免消费者读取消息 (2) 在消息 (1) 之后发布。
有什么机制可以做到这一点,或者每次我保存实体时,我都会在 DDBB 中随机存储其消息将在其中发布的分区 ID?
消费者也是如此。只有一个消费者可以同时读取一个分区,因为如果不是,消费者编号 1 可以从与实体(ID = 78198)相关的分区(1)读取消息(1),然后另一个可以从中读取消息(2)分区 (1) 与同一实体相关,并在第一条之前处理消息 2。
是否有任何机制可以根据微服务自动缩放将每个实例只订阅一个分区?
另一个选项是为每个新发布者实例动态分配一个分区,但我不知道如何动态配置它以根据微服务实例设置不同的分区 ID
顺便说一句,我正在使用spring启动
感谢您的回答和建议,如果我的英语不够好,请见谅。
如果您使用 Hash Partitioner
作为生产者配置中的分区器(这是许多库中的默认分区器),并且对同一实体使用相同的密钥(比如 entityID = ajsha87),kafka 设法发送所有具有相同分区的相同密钥的消息。
如果您使用组消费者,一个消费者实例负责一个分区,并且发布到该分区的所有消息仅由该实例消费。如果升级时有重新平衡,则可以更改实例。但同一分区中的消息仍然会从一个消费者实例中读取。
我有一个关于在 kafka 中发布和读取消息的方式的问题,用于具有多个相同微服务实例的微服务架构,用于写入和读取。 我这里的主要问题是发布和读取的微服务配置了自动缩放,但默认实例数为 1。
关键是我有一个实体,我们称之为“事件”,存储在 DDBB 中,每个实体在 DDBB 中都有自己的 ID。当在特定实体中执行某些特定命令时(比如 entityID = ajsha87),它必须发布一条消息,供消费者读取。如果同一实体的每条消息都写在不同的分区中并同时使用(并发问题),我会遇到很多问题。
我的问题是关于是否可以根据 entityID 例如我可以设置在哪个分区中发布该特定实体的所有事件。对于具有不同 ID 的另一个实体,我不关心分区,但同一实体的消息必须始终发布在同一分区中,以避免消费者读取消息 (2) 在消息 (1) 之后发布。 有什么机制可以做到这一点,或者每次我保存实体时,我都会在 DDBB 中随机存储其消息将在其中发布的分区 ID?
消费者也是如此。只有一个消费者可以同时读取一个分区,因为如果不是,消费者编号 1 可以从与实体(ID = 78198)相关的分区(1)读取消息(1),然后另一个可以从中读取消息(2)分区 (1) 与同一实体相关,并在第一条之前处理消息 2。
是否有任何机制可以根据微服务自动缩放将每个实例只订阅一个分区?
另一个选项是为每个新发布者实例动态分配一个分区,但我不知道如何动态配置它以根据微服务实例设置不同的分区 ID
顺便说一句,我正在使用spring启动
感谢您的回答和建议,如果我的英语不够好,请见谅。
如果您使用 Hash Partitioner
作为生产者配置中的分区器(这是许多库中的默认分区器),并且对同一实体使用相同的密钥(比如 entityID = ajsha87),kafka 设法发送所有具有相同分区的相同密钥的消息。
如果您使用组消费者,一个消费者实例负责一个分区,并且发布到该分区的所有消息仅由该实例消费。如果升级时有重新平衡,则可以更改实例。但同一分区中的消息仍然会从一个消费者实例中读取。