干货丨一文看懂KingbaseES进程间消息队列的实现
进程间通信(Interprocess communication)是指在不同进程之间传播或交换信息。
广义上,不同进程通过磁盘文件分享信息,也属于进程间通信的手段,但是一般都不把这算作“进程间通信”。狭义上,进程间通信(以下简称“IPC”,Interprocess communication)是一组编程接口,让程序员能够协调不同进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。一般情况下,IPC的主要目的是数据传输,数据共享,事件通知,资源共享,进程控制。
进程间通信原理示意
在KingbaseES中的IPC通信中,采用的是基于共享内存的消息队列机制,通过共享内存实现进程间通信,在异步场景下,还需要通知机制。在基于共享内存的消息队列机制上,KingbaseES采用latch机制实现跨进程的信号通知。具体连接和通信流程见下图。
服务端在启动时,会创建latch机制,用于后台进程的连接建立和后台进程的消息处理。守护进程会在全局共享内存中为各个服务端进程创建数组,此数组用于后台进程记录共享内存handle信息,其用于连接信道的建立。后台进程在启动时,创建共享内存,并基于共享内存创建消息队列。然后通过前述的全局数组,记录本进程共享内存的handle,并通过信号通知服务端进程。服务端进程在接收到信号后,Latch机制触发处理,其首先遍历全局连接数组,在发现新连接过来时,触发回调完成连接建立,并通过latch机制,通知对端连接建立完成。后续Backend即可通过消息队列发送消息,通过消息队列接受消息,通过信号通知对端。相应的服务端进程通过遍历所有接收消息队列,接受并处理消息,然后通过发送消息队列逐个发送处理结果,同样通过信号通知对应的后台进程。
这样实现的性能如何呢?在CentOS7.6系统,采用客户端同步,服务端异步的模式,进行了实际测试,结果如下: