首页 文章

唤醒Windows Azure辅助角色

提问于
浏览
0

在Windows Azure Worker角色中处理“紧急”消息的最佳方法是什么?

我有一个工作角色启动,无限时(真)循环并在此循环中:

  • 读取以查看队列是否有消息

  • 处理它们并删除它们

  • 如果没有更多的消息进入睡眠状态,首先使用Thread.Sleep(间隔)进行较小的间隔(10s),并逐渐将睡眠间隔增加到2分钟

  • 如果队列中出现消息,则会将休眠间隔重置为0并返回第1步

问题是如果 Worker 睡了2分钟并且队列中出现了一条消息,我想唤醒 Worker 而不是等待剩余的时间 .

有没有办法让 Worker 角色的实例告诉它醒来?我想在数据库中写一些东西,但后来我遇到同样的问题,即使我有一个这样做的角色,我怎么去唤醒已经睡觉的其他 Worker 角色呢?

2 回答

  • 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();
        }
    }
    

    以下是一些可以帮助您入门的好资源:

  • 2

    睡觉时间更短 . 你为什么要睡两分钟而不是一秒钟?从一个实例每秒轮询一次队列将在交易中每月花费约0.25美元 .

相关问题