单机上低延迟,高吞吐量数据传输的最佳并发框架

时间:2012-03-20 12:47:05

标签: c# multithreading asynchronous concurrency task-parallel-library

我正在寻找如何使用C#:

为我的特定架构实现并发框架的想法

我实现了几个模块/容器(实现为类),它们都是单独连接到消息总线的。每个模块主要产生或主要消耗,但所有模块还实现用于两个给定模块之间的通信的请求/应答模式。我对并发和异步编程非常陌生,但本质上希望以并发方式而不是同步方式运行整个架构。鉴于以下要求,我真的很感激为我的特定用例考虑哪些技术(TPL,ThreadPool,CTP,开源库,......):

  • 整个系统只能在本地计算机上运行(进程内,甚至是消息总线)
  • 至少有一个模块执行大量IO(每秒数百万条16byte消息从物理驱动器读取),在整个时间内将多个16字节块发布到阻塞集合。
  • 另一个模块在整个过程中都会使用阻塞集合。
  • 入口点是生产者开始发布消息,当生产者完成发布一组有限的16byte消息时退出。
  • 绕过消息总线的唯一通信是出于吞吐量和延迟原因而向阻塞集合发布/消费。 (很高兴听到有关摆脱消息总线的建议,如果它合理的话)
  • 其他模块处理诸如写入SQL数据库,发布到GUI服务器,连接到与外部服务器通信的API等操作。这些操作运行频率较低/受限制,可能作为任务运行而不是使用整个线程在整个系统运行期间。
  • 我使用的是64位四核16GB内存机器,但理想情况下我想实现一个也可以在双核心机器上运行的解决方案。

鉴于我喜欢管理你建议我应该关注的并发实现?

编辑:我想强调一点,我面临的最大问题是如何方便地将每个容器/模块连接到线程/任务池,以便每个模块在仍然提供的同时运行异步这些模块之间的完全进出通信。在我没有解决将所有模块连接到可以处理动态涉及的任务/线程数量的并发平台之前,我并不太关心优化单个生产者/消费者模式。

3 个答案:

答案 0 :(得分:2)

我找到了n-act http://code.google.com/p/n-act/,一个.Net的Actors框架,实现了我正在寻找的东西。我在我的问题中描述了我寻找更大的图片框架建议,并且我认为Actor框架解决了我需要的东西。我不是说n-act库将是我实现的,但它是一个设置可以异步通信并可以在自己的线程上运行的actor的简洁示例。消息传递还支持新的C#5异步/等待功能。

上面提到了Disruptor,也提到了TPL和其他想法,我很欣赏它的输入,它实际上让我思考,我花了很多时间来理解每个库/框架试图定位的内容以及尝试的问题要解决,所以投入非常丰富。

但是,就我的具体情况而言,我认为我认为Actors Framework正是我所需要的,因为我主要担心的是异步数据流的交换。不幸的是,我还没有看到任何.Net技术中实现的Actor模型()。 TPL Dataflow看起来非常有前途,但正如Weismat所指出的那样尚未准备就绪。

如果N-Act不能证明稳定或可用,那么我将通过TPL寻找自定义实现。无论如何,完全理解TPL必须提供的所有内容并开始在设计阶段同时思考而不是尝试将同步模型转换为异步框架。

总之,“演员模特”就是我所寻找的。

答案 1 :(得分:1)

对于像这样的任务,我建议使用disruptor-net,这样您就可以获得高吞吐量,低延迟和定义明确的数据流。

如果您愿意为某些线程管理牺牲一些性能,TPL Dataflow可能适合您。它在将TPL用于任务调度方面做得很好。

答案 2 :(得分:0)

如果您正在寻找基于框架的并发解决方案,您也可以查看Concurrency and Coordination_Runtime。我认为这可能适合您的设计理念 否则我会遵循这样的规则,即在应用程序的整个生命周期内运行某些内容时应使用线程,以及短期运行项目的任务。 我认为更清楚地定义对concurency的责任更重要,以便您以后可以更改框架。
像往常一样编写快速代码,没有经验法则,但需要进行大量测试,并使用小存根来测量实际性能。