【发布时间】:2015-08-07 11:37:30
【问题描述】:
我有一些任务存储在 SQL-Server 表中。每个任务都可以长期运行。我想在并行工作人员上处理它们。例如,当负载高时运行更多工作人员,并在不需要时停止它们。并且当一个工人不可用或他的工作失败时,处理任务应该在队列中返回。
在保证处理的情况下组织队列和增加工作人员的最佳方式是什么?可以更改任务存储。
【问题讨论】:
标签: c# sql-server multithreading architecture
我有一些任务存储在 SQL-Server 表中。每个任务都可以长期运行。我想在并行工作人员上处理它们。例如,当负载高时运行更多工作人员,并在不需要时停止它们。并且当一个工人不可用或他的工作失败时,处理任务应该在队列中返回。
在保证处理的情况下组织队列和增加工作人员的最佳方式是什么?可以更改任务存储。
【问题讨论】:
标签: c# sql-server multithreading architecture
看看Transacted MSMQ Binding。这允许您以事务方式推送、存储和处理消息。基本上可以通过三个主要步骤来获得所需的内容:
如果您遵循文章中的指南,则消息将返回到队列中,以防消费者服务无法处理它。该解决方案具有高度可扩展性。您可以以特别的方式添加任意数量的消费者服务,只需在不同的机器上启动一个新的消费者服务,它就会开始读取和处理队列中的消息。您还可以通过更改 maxConcurrentCalls 行为设置来控制消费者可以使用的线程数:
<behaviors>
<serviceBehaviors>
<behavior name="Throttled">
<serviceThrottling maxConcurrentCalls="1" />
</behavior>
</serviceBehaviors>
</behaviors>
默认为处理器计数的 16 倍。
请注意,增加线程数可能效率不高,尤其是在您的任务是 CPU 密集型的情况下。
希望对你有帮助!
【讨论】:
我决定使用 MS SQL 表作为队列,将所有请求存储在此队列中,并使用 Quartz.NET 运行乘法器。每个工人都会收到一个请求。每个请求仅由一名工作人员处理。
【讨论】: