【问题标题】:Parallel workers with guarantee of processing保证处理的并行工作者
【发布时间】:2015-08-07 11:37:30
【问题描述】:

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

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

【问题讨论】:

    标签: c# sql-server multithreading architecture


    【解决方案1】:

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

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

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

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

    默认为处理器计数的 16 倍。

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

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        相关资源
        最近更新 更多