当前位置:  开发笔记 > 编程语言 > 正文

构建Azure工作者角色以处理来自~10个队列的数据的最佳方法

如何解决《构建Azure工作者角色以处理来自~10个队列的数据的最佳方法》经验,为你挑选了1个好方法。

我有一个辅助角色,将数据抛入大约需要处理的10个队列中.有很多数据 - 可能每秒大约10-100条消息在各种队列中排队.

队列包含不同的数据并分别处理它们.特别是有一个非常活跃的队列.

我现在设置它的方式,我是一个单独的工作者角色,产生10个不同的线程,每个线程执行一个方法,有一个while(true){从队列获取消息并处理它}.每当备份队列中的数据时,我们只需启动更多这些进程,以帮助加快队列中数据的处理速度.此外,由于一个队列更活跃,我实际上启动了许多指向同一方法的线程来处理来自该队列的数据.

但是,我发现部署的CPU利用率很高.几乎达到或接近100%.

我想知道这是不是因为线程饥饿?或者因为访问队列是RESTful并且线程最终通过连接和减慢速度来阻止彼此?或者,是因为我使用:

while(true)
{
   var message = get message from queue;
   if(message != null)
   {
       //process message
   }
}

这会被执行得太快?

消息的每次处理也会将其保存到Azure表存储或数据库中 - 因此可能是保存占用CPU的数据的过程.

实际上,调试高CPU负载非常困难.所以,我的问题是:我是否可以进行一般性的架构更改,以帮助缓解+防止可能出现的任何问题?(例如,而不是使用while(true)使用不同类型的轮询 - 尽管我认为它最终对于该示例是相同的).

也许简单地使用新的Thread()生成新线程并不是最好的方法.



1> user94559..:

我建议在你的循环中放入一个sleep语句......不仅是紧密的循环可能会占用CPU资源,而且你还需要为存储事务付费.你每隔万次检查队列,就要花一分钱.这是一个很小的成本,但随着时间的推移它可能会增加很多.

我也经常使用这样的代码:

while(true) { var msg = q1.GetMessage(); if (msg != null) { ... } msg = q2.GetMessage(); if (msg != null) { ... } }

换句话说,连续轮询队列而不是并行(这应该完全是一个单词).这样你实际上一次只做一件事(如果你的任务是CPU密集的话很有用),但是你仍然在检查每个循环中的所有队列.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有