保证处理的并行工作者

Parallel workers with guarantee of processing

我有一些任务存储在 SQL-Server 的 table 中。每个任务都可以是long-运行ning。我想在并行工作人员上处理它们。例如 运行 在负载高时增加工人,并在不需要时停止他们。当一个工人不可用或工作失败时,处理任务应该return在队列中。

在保证处理的情况下组织队列和增加工作人员的最佳方法是什么?可以更改任务存储。

看看Transacted MSMQ Binding。这允许您以事务方式推送、存储和处理消息。基本上需要执行三个主要步骤才能获得所需内容:

  1. 创建一个持久队列,这样消息就不会在断电等情况下丢失。
  2. 创建发布者服务以将消息推送到队列。
  3. 创建消费者服务以读取和处理队列中的消息。

如果您遵循文章中的指南,一条消息将返回到队列,以防消费者服务无法处理它。该解决方案具有高度可扩展性。您可以以临时方式添加任意数量的消费者服务,只需在另一台机器上启动一个新的消费者服务,它就会开始读取和处理队列中的消息。您还可以通过更改 maxConcurrentCalls 行为设置来控制消费者可以使用的线程数:

<behaviors>
   <serviceBehaviors>
      <behavior  name="Throttled">
         <serviceThrottling maxConcurrentCalls="1" />
      </behavior>
   </serviceBehaviors>
</behaviors>

The default is 16 times the processor count.

请注意,增加线程数可能效率不高,尤其是当您的任务 CPU 密集时。

希望对您有所帮助!

我决定使用 MS SQL table 作为队列,将所有请求存储在这个队列中,运行 乘以 Quartz.NET 工人。每个工人收到一个请求。每个请求仅由一名工作人员处理。