【问题标题】:Is there guaranteed order of subscribers in chronicle queue?编年史队列中的订阅者顺序是否有保证?
【发布时间】:2018-01-29 17:34:25
【问题描述】:

我在看编年史,但我不明白一件事。

一个例子 - 我有一个有一个写入者的队列 - 市场数据提供者在它们出现时写入报价数据。 假设队列有 10 个读取器 - 每个读取器是读取新报价的不同交易策略,并可能发送买入或卖出订单,我们将它们命名为 Strategy1 .. Strategy10。 假设有一条规则,我在任何给定时间只能进行一笔交易。

现在的问题 - 据我了解,无法保证这些订阅的读者如何处理 tick 事件的顺序。每个策略都订阅了队列,所以每个策略都会异步获取新的tick。

所以当我第一次运行它时,可能是Strategy1先收到tick并下订单,然后所有其他策略都无法下订单。

如果我要重播相同的事件序列,则可能是不同的策略先处理报价单,然后下订单。

如果使用相同的初始事件序列,这将导致完全不同的结果。

我是不是理解错了,或者这真的是这样吗? 这个问题有哪些可能的解决方案?

我想要实现的是相同的源事件序列(报价)总是产生相同的交易序列。

【问题讨论】:

    标签: chronicle chronicle-queue


    【解决方案1】:

    如果您想要系统中的确定性,那么您需要删除非确定性的来源。在您的情况下,由于您一次只能打开一个交易,因此在单个线程(阅读器)上运行所有 10 种策略听起来是明智的。这也将消除读取器端任何同步的需要,以确保只有一个未平仓交易。

    然后,您可以对您的策略使用一些固定的排序(例如循环),对于给定的一组输入总是产生相同的输出。或者,如果决策逻辑太昂贵而无法串行运行,它可以并行执行,每个读取器都输入某种形式的门(类似 Phaser 的结构),在该门上可以决定使用什么策略确定性地。这种设计的缺点是最慢的交易策略会阻碍所有其他策略。

    【讨论】:

      【解决方案2】:

      认为您需要选择并发和独立需要多少,以及按顺序和连续需要多少。我建议您允许策略独立下订单,但是这些订单的读者通过检查序列号(例如第一个队列中的队列索引)以原始顺序处理它们。

      这样,订单的阅读者将按相同的顺序处理它们,而不管它们的处理和写入顺序如何,这似乎是您的目标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-18
        • 1970-01-01
        • 2013-08-29
        • 2013-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多