2015-10-20 63 views
1

我有一个非常基本的体系结构:有一种方法可以在Azure队列或服务总线中获得“处理完成”消息事件?

Queue和Worker(后台处理服务)中的Web API队列消息正在出队并处理消息。

问题是Web API不知道工作人员处理了messaged的时间。

工作者是否可以提醒队列消息已成功处理,并且队列发送回Web API“处理完成消息”事件?

一个解决方案,我想上:在Web API排队的消息

后,它会检查每对夫妇的第二个消息状态:

如果消息状态是“派克锁“ - 消息仍在处理中。

如果消息未在队列上找到 - 消息已处理(成功或失败,则无关紧要)。

但是,Microsoft没有预先制定的解决方案?

回答

3

需要此类报告的许多体系结构都由单独的队列处理,从处理器到请求者。这就是为什么BrokeredMessage对象上甚至有一个ReplyTo property。这个方法将会是请求者拥有它自己正在观看的队列。当它创建一条消息时,它会设置ReplyTo属性并将其发送。当工作人员处理消息时,它使用原始消息提供的队列路径将完成消息发送回请求者。

根据您的需要,您可能为您的整个前端拥有单个队列,或者每个实例可能都有自己的队列。请注意,在机器可能是瞬态的分布式系统中,每个Web API前端都有自己的队列可能会带来一些复杂性。

通常这是在请求者需要知道某件事完成时完成的,因此它可以以某种方式进行通信。例如,一个Web请求来进行处理。请求被放到队列中并在后端处理,并且完成消息返回到被拾取的前端,并且向用户发送通知(在某些情况下通过SignalR,其中具有背板)你不必担心哪个前端服务器收到响应消息)。

除了通过与请求者的直接通信或通过队列传递完成信息之外,没有任何东西允许您监视来自另一台计算机的消息的完成。查看消息状态不会对您有所帮助,因为除非您经常收到对消息的新引用,否则这些信息不会改变,如果您有很多消息需要处理,这些消息将无法很好地扩展。

+0

感谢Mike,所以如果我正确理解你的话,我会在Web-API和所有Worker实例之间有一个主队列,并且对于主队列中的每个工作(消息),我都会有另一个子队列用于在Web -API和特定的工作人员处理工作? – Ron

+0

一个队列将Web-API处理为工作程序路径。然后,如果特定的发起请求Wep-API服务器需要知道该过程已完成,那么可以是所有Web-API服务器正在监视的单个队列,也可以是每个Web-API服务器的队列。这取决于Web-API服务器在响应中所做的事情。 – MikeWo

+0

因此,对于最简单的场景,我需要两个队列: 1 - Web API将作业发布到其中。 2 - 用于Web API监视作业完成情况。 我说得对吗?如果你有任何关于它的文章的外部链接,我会感谢:) 谢谢迈克 – Ron

相关问题