【问题标题】:Do I need a sleep time in my worker role?我的工人角色需要睡眠时间吗?
【发布时间】:2012-01-24 05:56:57
【问题描述】:

我有一个监控队列的工作人员角色。尽管我希望它被猛烈抨击,但大多数时候该队列将是空的。我每隔几分钟就会在队列中获得一个新项目。

我有:

 public override void Run()
 {
     while (true)
     {
         //Check the queue for new messages
         //if there's a new message, do some stuff
     }
 }

我的问题是,如果队列中没有项目,我是否需要执行 Thread.Sleep(x) ?还是我可以一遍又一遍地检查它?如果我确实需要睡觉,我应该睡多长时间? (毫秒/秒?)

我主要关心的是 Azure 费用。

【问题讨论】:

    标签: azure azure-storage azure-worker-roles


    【解决方案1】:

    一种有助于最大程度降低交易费用(我认为这是您最关心的问题)的好方法是采用退避轮询方法。意思是,每次找不到队列消息时慢慢增加睡眠时间。这样做直到睡眠时间达到某个最大值。找到消息后,开始更快地轮询消息。

    另一种帮助方法是一次从队列中获取多条消息(而不是一次获取一条)。这也将有助于支付交易费用。

    【讨论】:

    • Mike 的 cmets 非常完美。关于实际时间值,我建议查看存储定价,每 10k 交易支付 0.01 美元。检查的实际频率应该在您愿意支付多少交易与您希望您的员工以多快的速度开始处理工作量之间取得平衡。
    • 谢谢大家。如果队列中没有项目,我想我会让它等待 1 秒。有了这个,最坏的情况我每天要付 87 美分。处理一个项目大约需要 2 秒,我每天大约会收到 500 个项目,所以应该比这少一点。我的用户希望他们的文件在上传后得到快速处理,所以效果非常好。
    • 认为您可能错了 10 倍:0.01 / 10,000 * 60 * 60 * 24 = 0.087 或 8.7c 每天。
    • 我是不是误会了什么——但是数据中心内的交易不是免费的吗?那么,如果工作者角色在同一个数据中心内运行就可以了吗?
    【解决方案2】:
    【解决方案3】:

    我还建议您检查消息上的 DequeueCount 以避免对中毒消息进行不必要的处理/收费。 例如,记录和删除超过设定的出队计数的消息,而不是在消息循环中的任何睡眠周期上旋转。

    【讨论】:

    • 谢谢,这很重要。昨晚我在进行本地测试,发现一条有毒消息,我的计算机试图整夜处理它。这个策略将有助于解决这个问题。
    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    相关资源
    最近更新 更多