并行工人保证处理

时间:2015-06-09 10:45:55

标签: c# sql-server multithreading architecture

我有一些任务存储在SQL-Server表中。每项任务都可以长期运行。我想在并行工作者上处理它们。例如,当负载较高时运行更多工作者,并在不需要时停止它们。当一个工作人员不可用或工作失败时,处理任务应该返回队列。

组织队列并将工作人员与处理保证相乘的最佳方法是什么?任务存储可以更改。

2 个答案:

答案 0 :(得分:0)

查看Transacted MSMQ Binding。这允许您以事务方式推送,存储和处理消息。实现基本上有三个主要步骤来获得所需:

  1. 创建一个持久性队列,以便在断电等情况下不会丢失消息。
  2. 创建发布服务以将消息推送到队列。
  3. 创建消费者服务以读取和处理来自队列的消息。
  4. 如果您遵循文章中的指南,则会在消费者服务无法处理消息时将消息返回到队列。该解决方案具有高度可扩展您可以以特殊方式添加任意数量的消费者服务,只需在另一台计算机上启动新的消费者服务,它就会开始读取和处理队列中的消息。您还可以通过更改maxConcurrentCalls行为设置来控制使用者可以使用的线程数:

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

    默认值是处理器数量的16倍。

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

    希望它有所帮助!

答案 1 :(得分:0)

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