1

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

谢谢

4

2 回答 2

3

最简洁的答案是不。

更长更复杂的答案是,您可以在 Aeron 之上构建一些东西来实现竞争性消费者/公平调度。主要挑战是您需要一些机制来管理消费者之间的协调。消费者分布得越广泛,这就越复杂。

单进程(多线程)

对于这种情况,单个生产者、多个消费者队列可能就足够了。一个线程从 Aeron 读取,复制和排队消息,消费者从队列中读取。Agrona 库(与 Aeron 一起提供)具有一些快速队列实现。

单主机

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

多台主机

为了管理这一点,需要某种中央代理来管理工作分配、确认、重新交付等。该服务需要是冗余的,以确保在代理本身失败时可以继续处理。可以想象,您可以在 Aeron Archive 和 Cluster 之上构建类似的东西,但我不推荐它。还有其他解决方案需要较少的协调开销,例如按业务键进行分区。

于 2020-08-22T09:00:35.697 回答
1

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

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

IMO - Aeron, 24West LBM 提供快速且有序/有序的事件交付。您希望在可靠模式下运行(LBM - UME 和 Aeron 集群),这样您就不会损失任何交易。多播真的很高效——一次写入,到处消费。此模式适用于交易系统,因为您可以卸载非关键流程。您可以使用“共享内存”来实现此目的,但您受限于单个物理服务器。您可以认为“aeron”实时复制共享内存。

此外,您将遇到物理边界 - 因此您经常必须使用“负载平衡器”将您的订单定向到特定服务器 - 与服务器中的线程关联模式相同。举一个具体的例子,期权市场数据量非常大 - 所以你想限制市场数据处理/消费。因此,您希望相关交易品种的订单由同一物理服务器处理。

于 2020-08-24T22:36:40.800 回答