在编年史队列中是否保证订户的订单?

时间:2018-01-28 09:51:24

标签: chronicle chronicle-queue

我正在看Chronicle,我不明白一件事。

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

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

因此,当我第一次运行它时,可能是Strategy1首先接收到滴答并下订单,所有其他策略将无法下订单。

如果我将重播相同的事件序列,可能是一个不同的策略首先处理tick,然后放置它的顺序。

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

我是否理解错误或这是真的有效吗? 这个问题的可能解决方案是什么?

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

2 个答案:

答案 0 :(得分:1)

如果您想在系统中使用确定性,那么您需要删除非确定性的来源。在您的情况下,由于您一次只能打开一笔交易,听起来在一个线程(读者)上运行所有10个策略是明智的。这也将消除读者方面任何同步的需要,以确保只有一个开放交易。

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

答案 1 :(得分:0)

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

这样,订单的读者将以相同的顺序处理它们,无论处理和编写的顺序如何,这似乎都是您的目标。