我想将Azure Queues用作高负载/高规模Web服务的状态机。
客户端将向Web服务端点提交请求,此时我将返回请求ID。
然后,我将消息提交到队列,以便工作者角色可以处理它,但在提交过程中不会发生数据库活动。相反,我想使用消息所在的队列来表示它的当前状态。
我的问题是,如果一个辅助角色从队列中抓取消息来处理它,它就会在该队列上变得不可见。如果我想检查该消息的处理状态,我的消息状态不明确。消息丢失/从未收到,或者它在队列中但是因为正在处理而不可见。
理想情况下,我希望能够在隐形信息中达到顶峰。如果我找到一个与请求ID匹配的,我知道它正在被处理,如果它是不可见的,或者它正在等待处理,如果它是可见的。显然,我知道它何时完成处理,因为该操作将导致数据库写入。
这是可能的,或者是我无法查看Azure队列中的不可见消息,这是不是?
Windows Azure存储队列用于传递消息。它们不会帮助您进行状态机处理,特别是因为每条消息至少可以处理一次(因为应用程序在处理消息时可能会遇到意外的异常情况,vm实例可能会崩溃等等,并且然后队列消息在超时后重新出现(现在可能与其余消息无关。
您最好使用Azure Table行(或SQL表行)。
在这种情况下,我建议使用blob来存储消息的状态。每当工作人员收到消息时,都可以包含blobID,并且工作人员可以更新状态blob。您的带外流程/网站/任何可以查询blob以收集状态信息。