多线程队列消费者和任务处理

时间:2014-08-23 00:53:38

标签: c#

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

但是,在追求BlockingCollection<T>或等效内容之前,根据您描述的方案,为什么不选择使用Tasks的简单解决方案。 TPL为您提供异步执行任务的功能,包括取消和延续等许多附加功能。但是,如果您需要更高级的生命周期管理,那么请选择类似BlockingCollection<T>的内容。


*“通常”,我暗示通用解决方案不一定能够针对您的具体情况发挥最佳效果,因为几乎可以肯定正确设计的自定义解决方案会更好。与每项决策一样,执行成本/收益分析。