我正在编写一个 Windows 服务来使用 MSMQ 消息。该服务将存在高活动期(80k 消息快速传入)和长时间不活动期(可能数天没有新消息)。
处理消息非常受网络限制,因此我从并行性中获得了很大的好处。但在不活动期间,我不想占用一堆线程来等待不会很快到来的消息。
MSMQ 接口似乎非常关注同步工作流程 - 获取一条消息,处理它,获取另一条消息,等等。我应该如何构建我的代码,以便我可以在高活动期间利用并行性,而不是捆绑一堆消息无活动期间的线程数量?使用 TPL 的奖励积分。伪代码将不胜感激。
多年来我已经分配了 MSMQ(包括移动实现),您对“同步工作流程”的描述是正确的。这并不是说您不能获取各种消息信封并通过 TPL 在不同的内核上处理它们……限制因素是读取/写入队列……本质上是串行操作。例如,您无法一次发送 8 条消息(具有 8 核的计算机)。
我有类似的需求(不使用 System.Messaging 命名空间),并在我读过的 Campbell 和 Johnson 所著的《Parallel Programming with Microsoft.NET》一书中的一些帮助下解决了这个问题。
查看他们的“并行任务”章节,特别是使用全局队列与每线程本地队列配合进行工作处理(即 TPL)的部分,该队列使用“工作窃取”算法来执行负载平衡。我的解决方案部分是根据他们的例子进行建模的。我的系统的最终版本在性能上有巨大的差异(从每秒 23 条消息到超过 200 条)。
根据系统从 0 到 80,000 所需的时间,您需要采用相同的设计并将其分布在多个服务器(每个服务器具有多个处理器和多个内核)。理论上,我的设置需要不到 7 分钟的时间来完成所有 80K,因此通过添加第二台计算机,可以将时间减少到大约 3 分 20 秒,等等。诀窍是窃取工作的逻辑。
深思……
快速编辑:顺便说一句,计算机是一台 Dell T7500 工作站,配备双四核 Xeons @ 3GHz、24 GB RAM、Windows 7 Ultimate 64 位版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)