【发布时间】:2017-03-02 09:26:39
【问题描述】:
我有一个场景,其中我需要一个 nservicebus 消息处理程序来防止同一 saga 的多个消息同时执行。
为了参数的处理程序会做这样的事情(在这个例子中过于简单了(
消息:
public class MyMessage : IMessage {
public int OrderId {get;set;}
public int NewQuantityLevel {get;set;}
}
传奇:
public void Handle(MyMessage message)
{
// call remote service to get current order quantity
// do some logic and update remote service with difference between original and new quantity
Bus.Send(new MyOtherMessage())
}
现在我是我的流程,我可以随时收到 2 条或更多这样的消息,我不希望他们检索可能已经在其他地方更新或修改的订单数量。
我考虑了几个解决方案:
- 为订单获取一个互斥锁(目前我们只有一个worker实例在一台机器上运行,但未来有可能拥有多个,在这种情况下我们可能会使用redis锁或类似的东西)
- 在服务中使用 sql 锁定对行/数据进行序列化锁定(但不确定这是否可行)
这些都不是最理想的,而且感觉我正在反对框架
【问题讨论】: