【问题标题】:Multi-threaded queue consumer and task processing多线程队列消费者和任务处理
【发布时间】:2014-08-23 00:53:38
【问题描述】:

我正在编写一个服务,它必须从 AMQP 消息队列中读取任务并根据消息类型执行同步操作。这些操作可能是发送电子邮件或访问 Web 服务,但假设没有错误,通常会在几百毫秒左右。

我希望它是可扩展的,以便将来可以添加其他操作。无论哪种方式,消息量都可能非常高,以 100 条/秒的速度涌入。

我正在玩几种设计,但我的问题如下:

  1. 我应该使用哪种类型的线程模型?我:

    • a) 使用单个线程从队列中消费并将任务放在线程池中?如果是这样,我如何表示这些任务?
    • b) 创建多个线程来托管自己的消费者并让它们同步处理任务?
    • c) 创建多个线程来托管他们自己的消费者,并让他们都注册一个委托来处理进来的任务?
  2. 在 a 或 c 的情况下,让衍生线程与主线程通信的最佳方式是什么?我需要确认从队列中出来的消息。我是否从主线程侦听的衍生线程引发事件?

  3. 在给定 x 核的情况下,是否有关于我应该运行多少线程的指南?是 x, 2*x 吗?该系统上还运行着其他服务。

【问题讨论】:

    标签: c#


    【解决方案1】:

    您应该通常*避免直接线程编程,而支持Task Parallel Library 和内置于 .NET 4.0 及更高版本的并发集合。幸运的是,您描述的生产者/消费者问题很常见,微软为此提供了一个通用工具:BlockingCollectionThis article 对其功能进行了很好的总结。您也可以参考this white paperBlockingCollection<T> 进行性能分析(除其他外)。

    但是,在使用 BlockingCollection<T> 或同等产品之前,鉴于您所描述的场景,为什么不选择使用 Tasks 的简单解决方案。 TPL 为您提供了任务的异步执行以及许多附加功能,例如取消和继续。但是,如果您需要更高级的生命周期管理,请选择 BlockingCollection<T> 之类的东西。


    * 通过“一般”,我暗示通用解决方案不一定会在您的特定情况下表现最佳,因为几乎可以肯定设计正确的自定义解决方案会更好。与每个决策一样,执行成本/收益分析。

    【讨论】:

      猜你喜欢
      • 2013-06-09
      • 2018-07-13
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      相关资源
      最近更新 更多