我们有一个单线程java进程,它将消息写入编年史队列。队列(SingleChronicleQueue)配置为每小时使用RollCycle。在每小时,当文件滚动发生时,编年史写入需要超过一秒钟(通常为1-2秒),这似乎发生在较大的文件大小(~50-90 GB)上。我们使用的是4.5.x编年史队列版本。对于如何解决这个问题,有什么想法吗?
我使用j堆栈工具进行了线程转储,以查看线程被卡在哪里。
at sun.nio.ch.FileChannelImpl.unmap0(Native Method)
at sun.reflect.GeneratedMethodAccessor3.invoke(Unkn
我们正准备使用编年史队列(SingleChronicleQueue)来记录我们的消息。原型现在可以工作了。然而,我们有一些问题。
读者可以修改消息吗?我们使用历史记录映射来记录索引读取,以便在重启后删除重复消息。如果这不起作用,我们希望标记在阅读器端读取的消息。实际上我们已经这样做了。现在的问题是,有时,我们会收到像"15c77d8be (62) was 8000003f is now 3f“这样的错误消息,我们怀疑这是因为现在跨缓存行边界的写入不再是原子的。推荐的解决方法是什么?目前我们在消息前加一个1字节的标签,加3个字节的填充能解决这个问题吗?
我们可以使用我们自己的滚动策略吗?