我正在编写一个必须从AMQP消息队列中读取任务并根据消息类型执行同步操作的服务。这些操作可能是发送电子邮件或点击Web服务,但假设没有错误,通常会在几百毫秒的数量级。
我希望这是可扩展的,以便将来可以添加其他操作。无论哪种方式,消息量都可能非常高,突发100秒/秒。
我正在玩几种设计,但我的问题如下:
我应该使用哪种类型的线程模型?我:
在a或c的情况下,生成的线程与主线程进行通信的最佳方法是什么?我需要确认队列中发出的消息。我是否从主线程侦听的衍生线程中引发事件?
在给定x核心的情况下,是否有关于我应该运行多少个线程的指南?是x,2 * x?此系统上还运行其他服务。
答案 0 :(得分:2)
你应该一般* 避免直接线程编程,而是支持.NET 4.0及更高版本中内置的Task Parallel Library和并发集合。幸运的是,您描述的生产者/消费者问题很常见,Microsoft有一个通用的工具:BlockingCollection。 This article对其功能进行了很好的总结。您还可以参考this white paper对BlockingCollection<T>
(以及其他内容)的效果进行分析。
但是,在追求BlockingCollection<T>
或等效内容之前,根据您描述的方案,为什么不选择使用Tasks的简单解决方案。 TPL为您提供异步执行任务的功能,包括取消和延续等许多附加功能。但是,如果您需要更高级的生命周期管理,那么请选择类似BlockingCollection<T>
的内容。
*“通常”,我暗示通用解决方案不一定能够针对您的具体情况发挥最佳效果,因为几乎可以肯定正确设计的自定义解决方案会更好。与每项决策一样,执行成本/收益分析。