在Windows Azure Worker角色中处理“紧急”消息的最佳方法是什么?
我有一个工作角色,在这个循环中开始,无限时(真)循环:
问题在于,如果工人睡了2分钟并且队列中出现了一条消息,我想唤醒工人,而不是等待剩余的时间。
有没有办法获得worker角色的实例并告诉它唤醒? 我想在数据库中写一些东西,但后来我遇到同样的问题,即使我有一个这样做的角色,我怎么去唤醒已经睡觉的其他工人角色呢?
答案 0 :(得分:3)
这是使用Windows Azure存储队列的缺点之一。您必须在成本和延迟之间做出选择。如果您想优化成本,您将实施退避政策(就像您所做的那样),但这意味着这将对您的邮件处理时间(延迟增加)产生影响。
在您的情况下,评估Windows Azure服务总线队列可能会很有趣(阅读差异here)。使用Service Bus Queues的优点是它支持长轮询,这意味着它将保持与服务器的连接,直到消息到达(或超时)。
以下是您通常会编写的一些示例代码(您仍需要管理异常等等):
QueueClient queueClient = factory.CreateQueueClient("myqueue");
while (true)
{
BrokeredMessage msg = queueClient.Receive(TimeSpan.FromSeconds(45));
if (msg != null)
{
var request = msg.GetBody<CreateOrderMessage>();
// Do something
msg.Complete();
}
}
以下是一些可以帮助您入门的好资源:
答案 1 :(得分:2)
睡觉时间更短。你为什么要睡两分钟而不是一秒钟?从一个实例每秒轮询一次队列将在交易中每月花费约0.25美元。