【发布时间】:2012-11-19 11:10:36
【问题描述】:
当我使用 10 个队列而不是 1 个队列时,为什么 MSMQ 的性能会下降(约三分之一)?
简而言之,当我在多线程应用程序中使用多个队列(从不同线程中的每个队列接收)时,MSMQ 性能会大幅下降。
就像 .NET 中的 MSMQ 类有一个共享资源,当队列数量增加时会缩小。顺便说一句,我使用 Windows 7 和 Visual Studio 2010 进行这些测试。
注意:我有 1 个队列用于在 2 个应用程序之间进行通信。我只需要使用可恢复模式。它工作正常,直到它达到 100-150 条消息/秒的墙。然后我想我可以通过将队列数量增加到 10 个并并行处理它们来提高处理能力。但是当我收到时,时间增加了近 3 倍! :O
我使用 C# 编写了我的应用程序。我以这种方式初始化我的读者线程:
for (int i = 101; i <= 110; i++)
{
var t = new Task<Tuple<TimeSpan, int, int, int>>(SingleQueueReceiver, i, TaskCreationOptions.LongRunning);
tasks.Add(t);
}
foreach (var t in tasks) t.Start();
我的队列名称是 buffer101 到 buffer110,我已经创建了它们。它们不是事务性的。我的接收任务函数(线程)是这样的:
static Tuple<TimeSpan, int, int, int> SingleQueueReceiver(object o)
{
var qID = (int)o;
TimeSpan SingleQueueReceiver_Elapsed = TimeSpan.FromMilliseconds(0);
int SingleQueueReceiver_Count = 0;
var watch = new Stopwatch();
watch.Start();
using (var q = new MessageQueue(string.Format(@".\private$\buffer{0}", qID), QueueAccessMode.Receive))
{
q.UseJournalQueue = false;
var @continue = true;
var sleep = TimeSpan.FromMilliseconds(1);
while (true)
{
if (!@continue)
{
watch.Stop();
SingleQueueReceiver_Elapsed = watch.Elapsed.Subtract(sleep);
return Tuple.Create(SingleQueueReceiver_Elapsed, SingleQueueReceiver_Count, qID, 2);
}
try
{
var m = q.Receive(sleep);
SingleQueueReceiver_Count++;
}
catch (MessageQueueException mqe)
{
if (mqe.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout) @continue = false;
}
}
}
}
【问题讨论】:
-
您尝试过使用 await-async 和 Parallel - TPL 吗?
-
不,我的问题通过使用 RabbitMQ 立即得到解决。
-
任何使用 RabbitMQ 和
Task(SingleQueueReceiver) 的样本? -
我从 [codethinked.com/using-rabbitmq-with-c-and-net//] 和 [dotnetcodr.com/2014/05/08/… 开始,并构建了一些抽象来使事情变得更容易,它对我很有效。后来我遇到了 [easynetq.com//],但从未在生产代码中使用过它。
标签: c# windows msmq message-queue administration