MSMQ能否解决多线程服务不足的性能瓶颈

本文关键字:性能瓶颈 服务 多线程 解决 MSMQ | 更新日期: 2024-09-21 06:52:30

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

200线程必须执行:

1-从互联网下载

2-分析原始数据(html、xml、json…)

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

对于约10个线程,第二次操作(解析)的运行时间为50ms(每个线程)

对于约50个线程,第二次操作(解析)的运行时间为80-18000毫秒(每个线程)

所以我们有了一个主意!

我们可以以多线程方式下载文档,但使用MSMQ,我们可以将原始数据发送到另一个进程(使用者)。另一个进程将第二部分(解析)实现为单线程。

你们可以说为什么不在同一个进程中使用c#Queue类。。我们无法阻止我们的"宝贵的解析线程"进行线程上下文切换。若同一进程中有200个线程,那个么宝贵的线程将成为上下文切换的牺牲品。

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

MSMQ能否解决多线程服务不足的性能瓶颈

是的,这是MSMQ很有意义的一个很好的例子。您可以将困难的工作转移到另一个流程来处理,而不会影响当前流程的性能,因为当前流程显然不关心结果。不仅如此,如果您的新工作进程宕机,队列将保留状态,消息(可能不是宕机时正在处理的消息)不会丢失。

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

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

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