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();
操作流程:
startExcerpt()
启动默认128K容量的容器(可通过重载方法自定义)- 使用丰富的
write
系列方法写入数据 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仓库获取完整实现。