1、PostgreSQL Latch 简介一种事件实现机制文一应急管理大学 在读本科生PostgreSQL Latch 简介Latch 模块在 PostgreSQL 扮演着事件处理框架的角色,被应用于处理与响应:客户端的接入与退出主进程状态变化、通知 walwriter 写入 wal 日志一些其它的事件(比如,等待超时)而在这一次技术报告中,我将向就 Latch 模块的理论基础、事件对象及工作流程展开讨论,期待促进大家对 Latch 模块的理解。PostgreSQL Latch 理论基础在 Latch 模块中,三类角色在各自的领域承担起了事件处理的工作:事件传递者事件的传递者负责事件的递达与传输,
2、是事件通知者与事件监听者的沟通桥梁,它与 Latch 所依托的系统接口息息相关。事件通知者事件通知者需要在事件发生的时候,主动在“事件集合”中发送通知以“唤醒”事件监听者,由此展开事件处理的工作。事件监听者事件监听者会“等待”事件的发生,在事件通知者引发“事件集合”的状态变化,进而使得自身“被唤醒”之后,主动展开事件的处理。PostgreSQL Latch 理论基础无论应用的场景有多么广泛,Latch 模块本质上只需要应对两种类型的事件:内部事件内部事件就是由服务器端自主处理即可响应完成的事件,典型的案例就是在 postmaster 进程退出时,主进程借助 Latch 模块的接口唤醒所有的子进
3、程,以此让 PostgreSQL 退出时所需要做的资源清理工作顺利完成。外部事件外部事件需要由“客户端-服务器”共同负责,典型的案例就是客户端接入时,保持着事件等待状态的服务端被唤醒,由此展开后续的会话建立工作。PostgreSQL Latch 实现原理Latch 模块依托于系统接口而实现,PostgreSQL 会根据编译时的选项选择对应的实现方案:poll(Unix)epoll(Linux)kqueue(BSD)Event(Windows)在这次技术演讲中,我将把咱们的关注点,放置于“基于 Linux Epoll 模型实现的 Latch 版本”,因为 Linux Epoll 应用广泛,知名度
4、高。Linux Epoll 编程接口Epoll 接口负责对一组文件的状态展开检测:Linux I/O 模型在 Linux 中,所有的设备都被抽象为“文件”,设备的状态变化体现为“文件”的状态变化。进程通信机制(IPC)进程之间、进程内部可以通过信号、管道、信号描述符(signal fd)等进程通信机制展开信息交流,这些机制可以作为事件通知的基础设施而被使用。Epoll 允许携带自定义的数据(User Data)在注册监听设备的同时,我们可以同时提供自定义的数据,如此就可以让我们的工作能够契合更丰富的场景。PostgreSQL Latch 事件对象在 Latch 模块的工作之中:WaitEven
5、tSet 负责整合 Latch 变量与 WaitEvent,将其文件描述符集合集体整合到一起,与 Epoll 等接口通信WaitEvent 包含在 epoll 接口的“用户自定义数据”中,在文件描述符状态发生变化以后,随描述符一并返回Latch 变量会包含在一个等待事件集合之中,作为一个标记值而存在。PostgreSQL Latch 自定义事件的工作原理PostgreSQL 的自定义事件分为三种基本的操作:SetLatch让 PostgreSQL 发送信号(在 Linux 下,为 SIGURG),让对应的文件描述符状态发生变化,进而结束 PostgreSQL 的事件等待状态,让 Postgre
6、SQL 转向事件处理,并将事件等待集合(WaitEventSet)中的 Latch 变量标记为 trueResetLatch对 Latch 变量进行重置,将其标记为 false,代表没有事件发生WaitLatch调用 epoll 或其它系统接口(不会直接调用,调用的是中间层接口),等待 Latch 被设置(PostgreSQL 有一个专门的 LatchWaitSet 全局变量,负责单纯的自定义事件等待)PostgreSQL Latch 客户端相关事件的工作原理客户端相关事件,