1. 概述

Chronicle Queue 使用内存映射文件持久化每条消息,实现跨进程数据共享。

核心优势:直接存储在堆外内存,彻底避免GC开销。专为高性能应用设计的低延迟消息框架。

本文将快速介绍其核心操作流程。

2. Maven依赖

添加以下依赖即可开始使用:

<dependency>
    <groupId>net.openhft</groupId>
    <artifactId>chronicle</artifactId>
    <version>3.6.4</version>
</dependency>

✅ 最新版本可通过Maven Central实时查询

3. 核心组件

Chronicle Queue 的三大核心概念:

  • Excerpt – 数据容器(⚠️ 不要理解为"摘录")
  • Appender – 数据写入器
  • Trailer – 顺序读取器

通过 Chronicle 接口预留内存操作区域:

File queueDir = Files.createTempDirectory("chronicle-queue").toFile();
Chronicle chronicle = ChronicleQueueBuilder.indexed(queueDir).build();

关键点:

  • 需要指定基础目录存储内存映射文件
  • ChronicleQueueBuilder 提供多种队列类型
  • 此处使用 IndexedChronicleQueue,通过顺序索引维护记录偏移量

4. 写入队列

创建 ExcerptAppender 实现数据写入:

ExcerptAppender appender = chronicle.createAppender();
appender.startExcerpt();

String stringValue = "Hello World";
int intValue = 101;
long longValue = System.currentTimeMillis();
double doubleValue = 90.00192091d;

appender.writeUTF(stringValue);
appender.writeInt(intValue);
appender.writeLong(longValue);
appender.writeDouble(doubleValue);
appender.finish();

操作流程:

  1. startExcerpt() 启动默认128K容量的容器(可通过重载方法自定义)
  2. 使用丰富的 write 系列方法写入数据
  3. finish() 完成写入并同步到磁盘

5. 读取队列

通过 ExcerptTailer 实现数据读取(类似Java迭代器):

ExcerptTailer tailer = chronicle.createTailer();
while (tailer.nextIndex()) {
    tailer.readUTF();
    tailer.readInt();
    tailer.readLong();
    tailer.readDouble();
}
tailer.finish();

关键步骤:

  • nextIndex() 检查是否有新数据可读
  • 使用对应的 read 方法获取数据
  • finish() 标记读取完成

6. 总结

Chronicle Queue 核心特性: ✅ 低延迟进程间通信 ✅ 基于内存映射文件的持久化存储(零数据丢失) ✅ 完全规避GC开销 ✅ 支持多进程并发读写(写入操作为同步模式)

适用场景:高频交易、实时计算等对延迟敏感的系统。

所有示例代码可在GitHub仓库获取完整实现。