1

抱歉这个挑剔的问题,我会尝试通过向您展示一个用例来详细说明(这不是我的真实案例,所以请不要记下事件/服务名称或职责):

考虑一个具有服务(除其他外)的系统:“商店”和“经济”。商店服务处理商品购买并发布三个事件:“CustomerBoughtItem”、“CustomerReturnedItem”和“StoreIsClosed”。现在,经济服务会收集这些事件并每天创建一份财务报告。该报告应在商店关闭后立即创建。至关重要的是,来自商店服务的所有事件都包含在每日报告中,这意味着经济服务在处理来自商店的所有事件之前无法创建其财务报告。在开始处理“StoreIsClosed”事件之前,如何确定性地确保所有“CustomerBoughtItem”和“CustomerReturnedItem”事件都已在终点处理?

4

1 回答 1

1

您可以使用以下模式:

打开一个 saga 并接收这三个消息。每条消息都有一个连续的 id(例如 int)。保存所有顺序 ID 并确定收到的每条消息:

  • 在某个时间点收到 StoreIsClosed 消息
  • 所有 id(从 0 或 1 到 StoreIsClosed-SequentialId 的 id)都是连续的,没有 id 丢失

如果满足这两个条件,则通过 .SendLocal (CreateDailyReportMessage) 将最后一条消息发送到您的 saga。

编辑以获得更好的格式并回答评论:

我假设另一个服务发布的“StoreIsClosed”事件是指:另一个服务现在不知道,最后一个 SequentialId 是什么或更一般的负责该事件的服务,StoreIsClosed 对客户交易一无所知。

所以商店服务必须隐式或显式地向您发送更多上下文信息,以便经济服务

例子:

  • (隐式)在您的 storeservice 中订阅 StoreIsClosed 事件并发布在您的 saga 中订阅的 CustomersHaveBoughtOrReturnedToday 消息。在这里,您可以包含一个交易 ID 列表,您可以在您的 saga 或其他某种校验和中交叉检查,例如交易总数或该商店的第一个顺序 ID 和最后一个顺序 ID。
  • (明确)在您的 sage 准备好完成之前明确询问您的商店服务是否已处理所有交易。(在你的传奇中发送/回复)
于 2012-08-29T10:00:25.603 回答