MSMQ可以解决多线程服务的性能瓶颈吗?

时间:2013-12-14 07:41:29

标签: c# multithreading performance msmq

我们写了使用~200个线程的服务。

200个主题必须:

1-从互联网下载

2-解析原始数据(html,xml,json ......)

3-将新创建的数据存储到db

对于第二次操作(解析)的~10个线程经过的时间是50ms(每个线程)

对于第二次操作(解析)约50个线程经过的时间是80-18000 ms(每个线程)

所以我们有个主意!

我们可以下载多线程文档但使用MSMQ我们可以将rawdata发送到另一个进程(使用者)。另一个流程将第二部分(Parsing)实现为单线程。

你可以说为什么不在相同的过程中使用c#Queue类..我们无法阻止我们的"宝贵的解析线程"来自线程上下文切换。如果同一进程中有200个线程,那么宝贵的将是上下文切换受害者。

使用MSMQ来满足此要求是正常的吗?

2 个答案:

答案 0 :(得分:1)

是的,这是MSMQ很有意义的一个很好的例子。您可以将难以处理的工作卸载到不同的流程来处理,而不会影响当前流程的性能,这显然不关心结果。不仅如此,如果你的新工作进程发生故障,队列将保留状态和消息(除了可能正在处理的消息之外)不会丢失。

根据您的需求和目标,我会考虑将下载卸载到其他进程 - 例如,将URL传递给队列。然后,扩展系统就像拨打队列接收器一样简单,因为如果正确实现,队列消息将以线程安全的方式接收。

答案 1 :(得分:1)

是的,这很正常。还有一些框架/库可以帮助您构建这些解决方案,为您提供的不仅仅是传输。

NServiceBus或MassTransit就是例子(两者都可以位于MSMQ之上)