编程语言
首页 > 编程语言> > c# – 构建Azure工作者角色以处理来自~10个队列的数据的最佳方法

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

作者:互联网

我有一个辅助角色,将数据抛入大约需要处理的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()生成新线程并不是最好的方法.

解决方法:

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

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

而(真)
{
   var msg = q1.GetMessage();
   if(msg!= null){…}
   msg = q2.GetMessage();
   if(msg!= null){…}
}

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

标签:c,architecture,azure,azure-storage
来源: https://codeday.me/bug/20190713/1451950.html