在现如今队列组件百花齐放的时代,再回头去分析一个曾经使用过的、简单易用、兼具开创性回溯消费的队列组件,也别具深刻意义。
PSQ队列是友缘在线早些年,由首席架构师独立编写的一个轻量级队列,该队列开箱即用、效率高,线上使用稳定,可以达到每秒并发4w-5w个请求,并开创性提供了队列回溯消费的功能。
PSQ见证了一句话:“简单即极致”。
技术架构
核心原理
底层数据结构
最底层使用了leansoft.bigqueue,此队列基于内存映射文件,具备LRU及页映射特性。
数据结构扩展
在原始队列的特性基础上,构建了环形队列,并支持回溯与持久化(使用NIO)特性。
网络接口
网络接口基于Netty实现,根据参数定制对应消息对象,由于NIO的模型特性,网络IO效率非常高。
服务包装
服务使用tanukisoftware.wrapper进行了包装,启动比较轻巧,可以很好的跟各类操作系统融合。
扩展特性
系统使用JMX扩展进行了Bean的监控和管理,有效提高了系统的可操作性。
磁盘与内存
在 LeanSoft BigQueue 中,Memory mapped page 是一种利用内存映射文件实现的存储方式。它允许应用程序映射一个磁盘文件到内存,从而避免从磁盘读取数据的慢速过程。通过使用 Memory mapped page,LeanSoft BigQueue 可以在内存和磁盘之间平衡读写性能,从而提高吞吐量。
Java 中可以使用 FileChannel 类刷新直接内存到磁盘。你可以使用该类打开一个文件,并使用 map 方法将该文件映射到直接内存。然后,你可以使用该内存中的数据进行操作,并通过调用 force 方法将其写入磁盘。
以下是使用直接内存和 FileChannel 类的示例代码:
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class DirectMemoryExample {
public static void main(String[] args) throws IOException {
File file = new File("data.dat");
// Open the file and map it to memory
RandomAccessFile raf = new RandomAccessFile(file, "rw");
FileChannel channel = raf.getChannel();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 1024);
// Write data to the memory
buffer.putInt(100);
buffer.putInt(200);
// Flush the changes to disk
buffer.force();
// Close the file
channel.close();
raf.close();
}
}
项目地址
PSQueueServer
PSQueueClient