我是非常基本的架构:
队列和工作人员(后台处理服务)中的Web API队列消息出列并处理该消息。
问题是Web API并不知道工作人员何时处理了消息。
工作者是否可以向队列发出消息已成功处理的消息,并且队列将发送回Web API"处理完成消息"活动?
我正在思考的一个解决方案:
在Web API对消息进行排队后,它会每隔几秒检查一次消息状态:
如果邮件状态为" Peck-Lock" - 邮件仍在处理中。
如果在队列中找不到消息 - 消息已被处理(成功或失败,则无关紧要)。
但微软没有预先制定的解决方案吗?
答案 0 :(得分:3)
许多需要此类报告的体系结构由一个单独的队列处理,从处理器到请求者。这就是为什么在BrokeredMessage对象上实际上甚至是ReplyTo property的原因。方法是请求者拥有它自己正在观看的队列。当它创建一条消息时,它会设置ReplyTo属性并将其发送。当worker处理消息时,它使用原始消息提供的队列路径将完成消息发送回请求者。
根据您的需要,您的整个前端可能只有一个队列,或者每个实例都可能拥有自己的队列。请注意,在具有可能是瞬态的机器的分布式系统中,让每个Web API前端都有自己的队列可能会带来一些复杂性。
通常,当请求者需要知道某些内容已完成以便以某种方式进行通信时,就可以完成此操作。例如,Web请求进入处理。请求被放入队列并在后端处理,并且完成消息被返回到前端,在那里它被拾取并且向用户发送通知(在某些情况下通过SignalR发送,其中如果背板到位,您不必担心哪个前端服务器收到了响应消息。
除了通过与请求者的直接通信或通过队列传达完成之外,没有任何东西可以让您观察来自另一台机器的消息的完成。检查邮件状态不会对您有所帮助,因为除非您定期获得对邮件的新引用,否则这些信息不会发生变化,如果您处理的邮件很多,则无法很好地扩展。