0
点赞
收藏
分享

微信扫一扫

PSQ队列核心原理简析

一点读书 2024-04-23 阅读 43

在现如今队列组件百花齐放的时代,再回头去分析一个曾经使用过的、简单易用、兼具开创性回溯消费的队列组件,也别具深刻意义。

PSQ队列是友缘在线早些年,由首席架构师独立编写的一个轻量级队列,该队列开箱即用、效率高,线上使用稳定,可以达到每秒并发4w-5w个请求,并开创性提供了队列回溯消费的功能。


PSQ见证了一句话:“简单即极致”。


技术架构

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


举报

相关推荐

0 条评论