具有多个实例的微服务事件驱动设计

Microservice Event driven Design with multiple Instances

目前我们设计并计划将我们的系统转换为微服务架构模式。

为了松散耦合,我们考虑使用 JMS 主题的事件驱动设计。这看起来不错。但是我现在不知道我们如何解决微服务的多个实例的问题。 对于故障转移和负载平衡,我们有每个服务的 n 个实例。如果向主题发布了一个事件,则每个实例都将接收并处理该事件。

可以使用数据存储中的锁和已处理状态来处理此问题。但是这个解决方案看起来非常昂贵,而且每个实例都有相同的工作。这对我来说不是负载平衡。

这个模式有什么好的解决方案或最佳实践吗?

为什么不用 Queue 而不是 Topic?然后您的实例将竞争消息而不是全部获得副本。

编辑

rabbitmq 可能更适合您 - 发布到扇出交换并绑定任意数量的队列,每个队列有任意数量的竞争消费者。

我还看到 JMS 主题在竞争客户端使用相同客户端 ID 连接的情况下使用。一些(全部?)经纪人将只允许一个这样的客户消费。其他人不断尝试重新连接,直到当前消费者死亡。