我正在开发执行以下操作的RESTfull Web服务:
我的问题是:我应该如何实现从MSMQ到Web服务的通信?具体来说,我的Web服务如何知道MSMQ客户端是否处理了消息?
我的第一个就是要做一份"工作" SQL数据库中的表,它包含一个JobId,一个指示作业是否完成的标志和计算结果。然后,MSMQ应用程序在完成作业时将写入此表,而Web服务将在数据库中查询每个请求的作业状态。我不太喜欢这种方法,因为我的网络服务不会使用SQL服务器 - 工作的结果是幂等的(但很耗时)而且我并不打算保存它返回的任何数据。方式。
我想知道是否有更多习惯用法解决这个问题,因为这是我第一次处理MSMQ或消息队列。
答案 0 :(得分:1)
通过在流程中引入一个非同步步骤,无论是否愿意,都进入eventual consistency领域。
这种方法存在固有的缺点,其中之一是如果调用者需要恢复系统一致性的知识,就必须不断检查收敛。
这并不是说我不同意你的做法,但如果你使用的是香草MSMQ,你需要了解这样做的后果。它自己的MSMQ没有为您提供服务总线类型平台所期望的消息交换语义,这将为您提供有关如何处理当前感知问题的更多选项。
例如,如果您可以通过msmq(通过使用类似NServiceBus)回复发件人,那么您可以使用某种服务器推送技术(如WebApi with SignalR)在不需要的情况下实时提醒客户端坚持到DB。
另一种方法是丢失异步步骤,并用同步调用替换它,如果离线过程足够快地完成,这将是可行的。
然而,这种方法最多是复杂的,我认为您目前的解决方案更简单。