Pub/Sub 的 Aeron 消息传递模式,一种方式和竞争消费者

Aeron Messaging Pattern for Pub/Sub, One Way and Competing Consumer

目前我正在评估 Aeron 我们的高频交易用例。正如我从文档中看到的那样,Aeron 基本上就是运输工具。这是一些更高级别的实现,例如竞争消费者、公平分配或与 RabbitMQ 类似的模式吗?

谢谢

简短的回答是否定的。

更长更复杂的答案是您可以在 Aeron 之上构建一些东西来实现竞争 consumer/fair 调度。主要的挑战是您需要某种机制来管理消费者之间的 co-ordination。消费者分布越广,情况就越复杂。

单进程(多线程)

对于这种情况,单个生产者、多个消费者队列可能就足够了。一个线程从 Aeron 读取消息,复制并 en-queuing 消息,消费者从队列中读取。 Agrona 库(Aeron 附带)有一些快速队列实现。

单主机

与单进程类似,您需要类似于队列的东西,但使用共享内存或类似方式实现。据我所知,没有任何开箱即用的东西可以做到这一点。

多个主机

要管理它,需要某种中央代理来管理工作分配、确认、re-delivery 等。此服务需要冗余,以确保如果代理可以继续处理本身失败了。您可以想象在 Aeron Archive 和 Cluster 之上构建类似这样的东西,但我不推荐它。还有其他需要较少 co-ordination 开销的解决方案,例如按业务键分区。

没有。竞争消费者不适用于交易应用程序。实际上,我已经看到许多交易应用程序试图采用类似的模式(即 SEDA 框架),但它无法扩展,更糟糕的是存在并发问题。

为了让竞争的消费者工作,任务是独立的并且可以运行并行。在交易应用程序中,您不能这样做,因为订单只能在 单个时间点 处理一个事件。我们通常会反转问题 - 使线程与特定顺序具有亲和力并确保每个事件都由同一线程处理 - 因此您可以实现顺序处理。

IMO - Aeron,24West LBM 提供快速且 sequenced/ordered 事件传递。您希望 运行 处于可靠模式(LBM - UME 和 Aeron 集群),这样您就不会损失任何交易。多播非常高效——一次编写,到处消费。此模式适用于交易系统,因为您可以卸载 non-critical 个进程。您可以使用 'shared-memory' 实现此目的,但您受限于单个物理服务器。您可以认为 'aeron' 在 real-time.

中复制了 shared-memory

此外,您将 运行 进入物理边界 - 因此您经常必须使用 'load-balacer' 将您的订单定向到特定服务器 - 与服务器内的 thread-affinity 相同的模式.举一个具体的例子,期权市场数据量非常大——所以你想限制市场数据 process/consumption。所以你希望相关符号的订单由同一台物理服务器处理。