我有一个优惠券服务,可以监听传入的销售情况,并根据已购买/退回的商品等更新优惠券。
因此,我们使用一个 SaleCompletedEvent,这可能会将优惠券置于“已兑换”或“可用”状态。
但是,不仅仅是销售可以改变优惠券的状态,平台中的其他事物(例如VoucherRedeemedEvent)也可能随时到达并更改优惠券的状态。在这种情况下,兑换券与销售无关。
因此,我们在多个事件主题中遇到了竞争问题:我们无法保证 SaleCompletedEvent 和 VoucherRedeemedEvent 会按照它们创建的顺序到达,因此我们可能会不按逻辑顺序处理这些事件,并最终得到一张优惠券错误的状态。
随着平台中事件数量的增长,我正在考虑将所有这些类型的事件(可能影响共享资源)放在同一个消息总线主题上,以便它们至少会按预期顺序到达消费。但是,随着平台赛事数量的增加以及比赛复杂性的增加,还有哪些其他方法可以用来解决此类问题?
您可能需要重新考虑您发送的消息。如果现实生活中有一个事件(销售),则仅发出一条消息。
如果我没弄错的话,如果在销售期间使用优惠券,您将发送一个 VoucherRedeemedEvent,然后发送一个 SaleCompletedEvent。我建议您只发出SaleCompletedEvent,并在其中包含优惠券已使用的信息。这将解决你的问题。