【问题标题】:Wake up Windows Azure worker role唤醒 Windows Azure 辅助角色
【发布时间】:2012-07-27 08:04:08
【问题描述】:

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

我有一个工人角色开始,执行无限的 while(true) 循环,并在这个循环中:

  1. 读取队列是否有消息
  2. 处理它们并删除它们
  3. 如果没有更多消息进入睡眠状态,首先使用 Thread.Sleep(interval) 进行较小的间隔 (10 秒),然后逐渐将睡眠间隔增加到 2 分钟
  4. 如果队列中出现一条消息,它会将睡眠间隔重置为 0 并返回到第一步

问题是,如果工作人员正在睡眠 2 分钟并且队列中出现一条消息,我想唤醒工作人员而不是等待剩余时间。

有没有办法获取worker角色的实例并告诉它唤醒? 我想在数据库中写一些东西,但后来我遇到了同样的问题,即使我有一个这样做的角色,我该如何唤醒另一个已经在睡觉的工作角色?

【问题讨论】:

    标签: azure azure-worker-roles


    【解决方案1】:

    这是使用 Windows Azure 存储队列的缺点之一。您必须在成本和延迟之间做出选择。如果您想优化成本,您将实施退避政策(就像您所做的那样),但这意味着这会影响您的消息何时被处理(增加延迟)。

    在您的情况下,评估 Windows Azure 服务总线队列可能会很有趣(了解差异here)。使用服务总线队列的优势在于它支持长轮询,这意味着它将保持与服务器的连接直到消息到达(或超时)。

    以下是您通常会编写的一些示例代码(您仍然需要管理异常等...):

    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 美元。

      【讨论】:

        猜你喜欢
        • 2012-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-22
        • 2014-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多