并行工人,保证加工
本文关键字:并行 | 更新日期: 2023-09-27 17:54:42
我有一些任务存储在SQL-Server的表中。每个任务都可以长时间运行。我想在并行工人上处理它们。例如,在负载高时运行更多的工人,并在不需要时停止它们。当一个工人不可用或工作失败时,处理任务应该在队列中返回。
在保证处理的情况下组织队列和增加工人的最佳方法是什么?可更改任务存储
查看已处理的MSMQ绑定。这允许您以事务的方式推送、存储和处理消息。基本上有三个主要步骤来实现你所需要的:
- 创建一个持久队列,以便在停电等情况下消息不会丢失。
- 创建发布者服务,将消息推送到队列。
- 创建一个消费者服务来读取和处理队列中的消息。
如果您遵循本文中的指导方针,则在消费者服务无法处理消息时,消息将返回到队列中。该解决方案具有高度可扩展性。您可以以一种特别的方式添加任意多的消费者服务,只需在另一台机器上启动一个新的消费者服务,它就会开始读取和处理来自队列的消息。您还可以通过更改maxConcurrentCalls行为设置来控制消费者可以使用的线程数:
<behaviors>
<serviceBehaviors>
<behavior name="Throttled">
<serviceThrottling maxConcurrentCalls="1" />
</behavior>
</serviceBehaviors>
</behaviors>
默认值是处理器数的16倍。
请注意,增加线程数可能不是很有效,特别是如果你的任务是CPU密集型的。
希望有帮助!
我决定使用MS SQL表作为队列,将所有请求存储在此队列中,使用Quartz.NET运行多个worker。每个worker接收一个请求。每个请求只由一个worker处理。