c# - 单机低延迟、高吞吐量数据传输的最佳并发框架

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

关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

5年前关闭。




Improve this question




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

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

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

  • 鉴于我喜欢管理哪些并发实现,您建议我应该关注什么?

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

    最佳答案

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

    上面提到了 Disruptor 以及 TPL 和其他一些想法,我很欣赏输入,它真的让我思考,我花了很多时间来了解每个库/框架试图针对什么以及它试图解决什么问题,所以投入是非常有成效的。

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

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

    总而言之,“ Actor 模型”是我一直在寻找的。

    关于c# - 单机低延迟、高吞吐量数据传输的最佳并发框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9787035/

    相关文章:

    c# - 通过 switch 语句处理对象集合

    c# - 使用文化信息将 unix 时间转换为特定的日期时间格式

    c# - 使用 AutoResetEvent 同步两个线程

    Swift 单元测试 : async

    c# - 将 Unicode 中的日期时间字符串(带有阿拉伯数字)转换为 DateTime 对象

    c++ - 从另一个非 gui 线程启动 QTimer

    java - 如果发生异常,如何重新启动已调度的线程?

    带有 Slack 机器人的 Python asyncio

    c++ - WriteFile() block (通过命名管道从 C++ 客户端写入到 C# 服务器)

    c# - 如何使类(class)成员受到保护和内部?