请问微服务架构下,有什么方式能确保消息队列在同一个服务集群只有一个个体收到事件?
在 之前的提问 中,有提到我想利用消息队列机制来达到各服务解耦
借由某种广播机制,在订单建立完成后,由订单服务发出「订单建立成功」的广播,告诉其他服务有订单建立。库存服务接收到广播后就会扣除库存,并再次发出「库存扣除成功」的广播,由订单服务再次接收。而其他不相干的服务就会忽略广播。
但碰到一个问题:在 K8S 的架构下可能同一个服务会出现多个实例(Pod),那我要如何确保各服务能确实收到事件,且不会重复触发?
目前我得到几种解决方案,但各有一些无法解决的问题,或实作上不知从何下手,方案分述如下:
- 在 AWS 中,可使用 SNS 发送事件,再由 SQS 服务接收事件,由各服务从自己的 SQS 领取事件,但我们云端选择 GCP
- 在 GCP 中有 Pub/Sub,但可能会有多台服务实例作为 Subscriber,无法确保不会重复触发
- Redis 本来就有提供 Pub/Sub 功能,但问题跟(2)一样
- 用某种方式将 Event 同时发送到同一台 Redis 的不同 DB,各服务监听不同的 DB,因事件被一服务实例领取后就会暂时锁住,所以可以确保不会重复触发
- 用某种方式将 Event 同时发送到不同 Redis,各服务从自己的 Redis 领取事件,同(4),因事件被一服务实例领取后就会暂时锁住,所以可以确保不会重复触发
请问有人碰过类似的状况,或了解微服务架构,能给我一些指导建议吗?
推荐文章: