我有一个工作角色,将数据放入大约 10 个需要处理的队列中。有很多数据 - 可能每秒大约 10-100 条消息在各种队列中排队。
队列保存不同的数据并分别处理它们。特别是有一个非常活跃的队列。
我现在设置它的方式,我是一个单独的工作者角色,它产生 10 个不同的线程,每个线程执行一个方法,该方法有一段时间(真){从队列中获取消息并处理它}。每当队列中的数据得到备份时,我们只需启动更多此类进程以帮助加快队列中数据的处理速度。此外,由于一个队列更活跃,我实际上启动了许多指向同一方法的线程来处理来自该队列的数据。
但是,我看到部署的 CPU 利用率很高。几乎始终处于或接近 100%。
我想知道这是否是因为线程饥饿?还是因为访问队列是 RESTful 的,并且线程最终通过建立连接并减慢速度而相互阻塞?或者,是因为我使用:
while(true)
{
var message = get message from queue;
if(message != null)
{
//process message
}
}
这执行得太快了?
消息的每次处理也会将其保存到 Azure 表存储或数据库 - 因此可能是保存此数据的过程正在消耗 CPU。
实际上,调试高 CPU 负载真的很困难。所以,我的问题是:我是否可以进行一般的架构更改来帮助缓解+防止任何可能存在的问题?(例如,使用不同类型的轮询而不是使用 while(true) - 尽管我认为该示例最终是相同的)。
也许简单地使用 new Thread() 产生新线程并不是最好的方法。