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

Mat*_*olf 7 c# concurrency multithreading asynchronous task-parallel-library

我正在寻找使用C#如何为我的特定架构实现并发框架的想法:

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

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

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

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

Mat*_*olf 2

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

上面提到了 Disruptor,还有 TPL 和其他一些想法,我很欣赏您的意见,它实际上让我思考,我花了相当多的时间来理解每个库/框架试图瞄准的目标以及它试图解决的问题,因此,我们的投入非常富有成效。

然而,对于我的特殊情况,我认为我相信 Actors 框架正是我所需要的,因为我主要关心的是异步数据流的交换。不幸的是,我还没有看到任何 .Net 技术中实现的 Actor 模型。TPL Dataflow 看起来非常有前途,但正如 Weismat 指出的那样,它尚未准备好投入生产。

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

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