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

本文关键字:数据传输 吞吐量 最佳 框架 并发 单机 实现 延迟 | 更新日期: 2023-09-27 18:28:26

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

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

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

考虑到我喜欢管理什么并发实现,你建议我应该专注于什么?

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

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

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

上面提到了Disruptor,还有TPL和其他一些想法,我很感激这些意见,它确实让我思考,我花了很多时间来了解每个库/框架试图针对什么以及它试图解决什么问题,所以这些意见非常有成效。

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

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

总之,"演员模型"是我想要的。

对于这样的任务,我建议使用distributor net,因为它具有高吞吐量、低延迟和定义良好的数据流。

如果您愿意为一些线程管理牺牲一些性能,那么TPL数据流可能对您有用。它很好地利用TPL进行任务调度。

如果您正在寻找基于框架的并发解决方案,您也可以研究Concurrency和Coordination_Runtime。我认为这可能适合你的设计想法
否则,我会遵循以下规则,即当某个东西在应用程序的整个生命周期内运行时,应该使用线程,而对于短时间运行的项目,应该使用任务
我认为更重要的是,明确界定一致性的责任,这样你以后就可以改变框架
与通常编写快速代码一样,没有经验法则,但需要使用小存根进行大量测试,以测量实际性能。