c# – 构建Azure工作者角色以处理来自~10个队列的数据的最佳方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 构建Azure工作者角色以处理来自~10个队列的数据的最佳方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1557字,纯文字阅读大概需要3分钟。
内容图文
![c# – 构建Azure工作者角色以处理来自~10个队列的数据的最佳方法](/upload/InfoBanner/zyjiaocheng/763/f5a3d1f38c094bdc99f2766de743f576.jpg)
我有一个辅助角色,将数据抛入大约需要处理的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# – 构建Azure工作者角色以处理来自~10个队列的数据的最佳方法全部内容,希望文章能够帮你解决c# – 构建Azure工作者角色以处理来自~10个队列的数据的最佳方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。