查看原文
其他

干货丨一文看懂KingbaseES进程间消息队列的实现

人大金仓 金仓数据库
2024-11-11

进程间通信(Interprocess communication)是指在不同进程之间传播或交换信息。

广义上,不同进程通过磁盘文件分享信息,也属于进程间通信的手段,但是一般都不把这算作“进程间通信”。狭义上,进程间通信(以下简称“IPC”,Interprocess communication)是一组编程接口,让程序员能够协调不同进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。一般情况下,IPC的主要目的是数据传输,数据共享,事件通知,资源共享,进程控制。


进程间通信原理示意

根据实现方式的不同,IPC分为七种类型,分别是管道(pipe),命名管道(FIFO),消息队列(MessageQueue),共享存储(SharedMemory),信号量(Semaphore),信号(Signal),套接字(Socket)等。它们具体使用的场景并不相同,一般在无血缘关系进程间的大批量消息通信中,消息队列、共享内存和套接字使用场景较多。

在KingbaseES中的IPC通信中,采用的是基于共享内存的消息队列机制,通过共享内存实现进程间通信,在异步场景下,还需要通知机制。在基于共享内存的消息队列机制上,KingbaseES采用latch机制实现跨进程的信号通知。具体连接和通信流程见下图。

服务端在启动时,会创建latch机制,用于后台进程的连接建立和后台进程的消息处理。守护进程会在全局共享内存中为各个服务端进程创建数组,此数组用于后台进程记录共享内存handle信息,其用于连接信道的建立。后台进程在启动时,创建共享内存,并基于共享内存创建消息队列。然后通过前述的全局数组,记录本进程共享内存的handle,并通过信号通知服务端进程。服务端进程在接收到信号后,Latch机制触发处理,其首先遍历全局连接数组,在发现新连接过来时,触发回调完成连接建立,并通过latch机制,通知对端连接建立完成。后续Backend即可通过消息队列发送消息,通过消息队列接受消息,通过信号通知对端。相应的服务端进程通过遍历所有接收消息队列,接受并处理消息,然后通过发送消息队列逐个发送处理结果,同样通过信号通知对应的后台进程。

这样实现的性能如何呢?在CentOS7.6系统,采用客户端同步,服务端异步的模式,进行了实际测试,结果如下:

由此可见,KingbaseES的性能在字节量少时,属于优秀的,在字节量大时也并不很差,在中等字节量时表现出色,KingbaseES具备良好的IPC机制。

继续滑动看下一个
金仓数据库
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存