保存 ChronicleQueue 的消费者/尾端读取偏移量

问题描述

我正在探索 ChronicleQueue 以保存在我的一个应用程序中生成的事件。我想在经过一些处理后按照其原始发生顺序将保存的事件发布到不同的系统。我有我的应用程序的多个实例和每个实例可以运行单线程 appender 将事件附加到 ChronicleQueue。虽然跨实例排序是必要的,但我想了解这两个问题。

1)如何保存我的事件的读取索引的索引,以便我最终不会多次从历史记录队列读取和发布相同的消息。

在下面的代码中(摘自github中的例子),当我们重新启动应用程序时,索引被保存直到我们到达队列的末尾。当我们到达队列的末尾时,我们最终读取了所有的消息再次从头开始。我想确保对于由tailer Id标识的特定消费者,消息只读取一次。我是否需要将读取索引保存在另一个队列中并使用它来实现我在这里需要的东西。>


String file = "myPath";
try (ChronicleQueue cq = SingleChronicleQueueBuilder.binary(file).build()) {
  for(int i = 0 ;i<10;i++){
    cq.acquireAppender().writeText("test"+i);
  }
}


try (ChronicleQueue cq = SingleChronicleQueueBuilder.binary(file).build()) {
    ExcerptTailer atailer = cq.createTailer("a");
    System.out.println(atailer.readText());
    System.out.println(atailer.readText());
    System.out.println(atailer.readText()); 
}

2)如果有一种方法可以保留跨实例的事件顺序,还需要一些建议。

解决方法

使用命名的tailer 应该确保tailer 只读取一次消息。如果您有一个不会发生这种情况的示例,您可以创建一个测试来重现它吗?

写入时队列中条目的顺序是固定的,所有tailer以相同的顺序看到相同的消息,没有任何选择。