检查MSMQ消息的状态和结果

时间:2014-07-13 11:04:19

标签: web-services rest message-queue msmq

我正在开发执行以下操作的RESTfull Web服务:

  1. 在POST请求中,它启动一个长时间运行的任务。它为MSMQ排队消息,MSMQ在Windows服务托管应用程序中处理。它返回HTTP状态代码202 Accepted以及我们排队的作业的id。
  2. 客户端应用程序不断轮询服务(使用GET),其中包含我们刚刚排队的作业的id。当MSMQ客户端完成任务时,它应该返回操作的结果。如果没有,它将返回202 Accepted,并为下次推荐的投票提供适当的到期日期。
  3. 我的问题是:我应该如何实现从MSMQ到Web服务的通信?具体来说,我的Web服务如何知道MSMQ客户端是否处理了消息?

    我的第一个就是要做一份"工作" SQL数据库中的表,它包含一个JobId,一个指示作业是否完成的标志和计算结果。然后,MSMQ应用程序在完成作业时将写入此表,而Web服务将在数据库中查询每个请求的作业状态。我不太喜欢这种方法,因为我的网络服务不会使用SQL服务器 - 工作的结果是幂等的(但很耗时)而且我并不打算保存它返回的任何数据。方式。

    我想知道是否有更多习惯用法解决这个问题,因为这是我第一次处理MSMQ或消息队列。

1 个答案:

答案 0 :(得分:1)

通过在流程中引入一个非同步步骤,无论是否愿意,都进入eventual consistency领域。

这种方法存在固有的缺点,其中之一是如果调用者需要恢复系统一致性的知识,就必须不断检查收敛。

这并不是说我不同意你的做法,但如果你使用的是香草MSMQ,你需要了解这样做的后果。它自己的MSMQ没有为您提供服务总线类型平台所期望的消息交换语义,这将为您提供有关如何处理当前感知问题的更多选项。

例如,如果您可以通过msmq(通过使用类似NServiceBus)回复发件人,那么您可以使用某种服务器推送技术(如WebApi with SignalR)在不需要的情况下实时提醒客户端坚持到DB。

另一种方法是丢失异步步骤,并用同步调用替换它,如果离线过程足够快地完成,这将是可行的。

然而,这种方法最多是复杂的,我认为您目前的解决方案更简单。