混合异步/同步架构

问题描述:

这个问题一直困扰着我几个星期,但我太急于以明智的事后处理它。我终于向agog客户提供了一个快速和肮脏的解决方案,以缓解他脆弱的神经(作为结果,也是我的&)。我现在终于花时间用自由的头脑来审视这个问题。混合异步/同步架构

基本上,我面临的挑战是尽可能快地处理同步数据(Time-Ordered Series)(< 5ms)。在尝试了许多Rube-Goldberg风格的设计之后,比如有序的线程池和混合解决方案,其中包括平行工作者队列和其他不可思议的牵强的想法,一个彻底的实践工作台证明,坚持一个普通的“旧单线程链处理是数据完整性和性能的最佳选择。

但是,在应用程序底部的某个点,这会达到一定的限制。我需要以并行方式向不同的处理器广播数据。而这正是我头痛又开始的地方。 当我使数据中心(见下文)以异步方式(通过线程&二进制环形缓冲区)向处理器发送数据时,接收方以混乱的顺序接收数据,并且数据顺序被破坏。

因此,我正在寻找一种以并行方式向所有处理器发送数据的方式,并保持顺序。我的另一个担心是异步性:如果数据中心的SendEvent委托人以简单的传统方式(通过+=)通过进程的Receive方法订阅,那么这将如何表现?
首先,我不希望订阅被称为“一个一个”。我相信有一种方法可以将其并行化。其次,最重要的是,我确实不希望处理器A锁定整个链条,直到完成其工作。

所以这里是人。长话短说,我想找到一种明智的方式来不断等待数据处理,而不必等待处理器发送数据,但同时我需要每个数据处理器以有序的方式接收数据。这可能听起来不兼容,但我确信有一个很简单的方法来做到这一点(但我深深地陷入了这个问题,我非常困惑,这就是为什么我要求你的帮助,好人)

enter image description here

+0

我喜欢你的“平行工人队列”的想法。具体而言,[阻塞队列](http://stackoverflow.com/a/530228)允许数据在等待处理时排队。 – 2012-07-16 15:33:32

+0

处理器位于单个(多核)系统还是分布式计算机?需要预处理器还是后处理器或两者兼容?什么是.NET版本? – oleksii 2012-07-16 15:37:18

+0

什么构成你的问题中的“秩序”? – Kit 2012-07-16 16:23:12

如果你在谈论中,你需要有序系列分发到所有处理器在同一台机器上一台机器,我会数据中心,与单线程的想法继续,排队连续N私人排队(速度相对较快,所以我不担心封锁,而且您知道该物品已入队到全部队列中)。

这些专用队列中的每一个都只允许来自一个处理器的唯一队列。可能较慢的“数据集线器 - >处理器”将被并行调用,但不会阻塞整个链,因为您会这样做,因为......然后,您可以配置1个处理器/队列/线程(简单管理)或1个队列/ N个队列/类似无状态处理器(这将需要额外的下游工作来进行重新排序)。

在更分散的系统(例如多机)中,您通常会有类似的数据中心向消息“主题”发送消息,然后让消息传递基础结构发送给所有消费者。

这听起来像你正在寻找Service Bus。在你的图中,这将是数据中心。微软提供了一个名为MSMQ的服务,可以用于这样的事情,我喜欢使用名为NServiceBus的库来简化事情。

+1

我认为OP将很难用消息队列获得小于5ms的响应时间。 – 2012-07-16 15:54:59

+0

真..错过了那部分。尽管如此,架构仍然适用。 – 2012-07-16 16:03:55

+0

@SteveCzetty:别担心,但几年前我在一家大金融公司的MSMQ支持团队负责时,几乎陷入了沮丧。不是真正我生命中最好的纪念品:-)这个技术是一个杀死飞行恕我直言的锤​​击。但我的意见是100%有偏见 – 2012-07-16 17:47:59

不知道它是否最适合,但zeromq可能适合你。你可以拥有所有内存(快速)的队列,你可以扇出然后将消息压缩成多种配置(我认为它可以处理顺序等)。我有没有在项目中使用zeromq的经验,但是,它确实有一些引人注目的功能,似乎很好的支持(包括许多客户端语言,C#)。

The manual page有一个很好的介绍视频,显示该工具可以实现的功能。