Skip to content

事件驱动模块的设计

Keywords 关键词epoll, 事件驱动,多路复用

Abstract 摘要event**事件驱动框架是一种基于epoll**多路复用的异步编程框架,包含调度主体、epoll**封装及事件类型支持等模块。

List of abbreviations 缩略语清单

Abbreviations缩略语 Full spelling 英文全名 Chinese explanation 中文解释

1 概述

【关键内容】

伴随着sysmaster项目的推进,需要底层编程框架的支持,来方便的管理和调度异步事件,并进行相应的调度,同时方便代码开发,使开发者免于关注底层细节,直接使用封装好的事件类型来进行异步编程。

1.1 目的

【关键内容】

本文档主要针对event模块的功能进行设计,明确0层架构以及内部各个组件的详细设计,明确主要数据结构和主要处理过程,作为今后的编码阶段的输入和编码人员、测试人员的指导。

2 特性需求概述

表2:特性需求列表

需求编号 需求名称 特性描述 优先级
1 Poll事件封装层 提供一个统一的poll接口层,封装对epoll等底层异步事件注册、删除、监听,可以屏蔽底层平台和架构差异。
2 Event调度框架实现 提供对异步事件的注册、调度、删除,支持优先级。
3 Source事件类型支持 提供对常见的异步事件支持,如io、timer、signal等,方便开发者使用

3 需求场景分析

3.1 特性需求来源与价值概述

结合传统1号进程优缺点,有必要全新构建1号进程来应对未来场景。事件驱动异步编程框架作为软件底座,需要精确设计,而提供统一的框架有利于简化项目模型,加速软件开发。

3.2 特性场景分析

使用该特性的用户主要为开发者,开发者通过使用统一的接口,只需要注册事件的类型,及收到事件后如何处理,便能完成异步代码的开发。Event框架充当调度器角色,管理、监听及调度。

3.3 特性影响分析

Event编程框架屏蔽了底层平台差异,封装了细节,使用rust开发,具有高可靠性。无其他依赖,唯一交互是API。

3.4 友商实现方案分析

友商 特点
Systemd 以epoll为基础,实现event调度框架 C语言、不支持mac、windows等平台
Upstart 当前无此特性
Sysvinit 当前无此特性

4 特性/功能实现原理

4.1 总体方案

整个特性包含三个模块,Mod Event,Mod Poll和Mod Sources。

1. Mod Poll:封装底层的epoll(unix)、kqueue(mac),向上提供统一的Poll接口。

2. Mod Event:实现一个调度框架,处理事件注册、监听和调度。同时提供Trait Source,实现了该Trait的Mod Sources都可以方便的被Event调度框架管理。

3. Mod Sources:默认提供实现了Trait Source的常见事件类型,供用户使用。

4.2 Mod Poll模块设计

Mod Poll是对底层异步IO的封装,呈现统一的struct Poll视图。

类及接口

通过在不同平台下,实现上图中的接口,来达到对该平台的支持。在linux下,这些接口背后是由epoll接口实现。在mac下,这些接口由kqueue实现。

上层无需关注细节,通过调用Poll提供的接口,可以方便的注册、再注册、注销事件的监听。

该Mod被Mod Event调用。

4.3 Mod Event模块设计

Mod Event有Event调度器和Trait Source组成。前者负责事件的管理和调度,后者负责定义能被调度器管理的行为接口。

4.3.1 Struct Event

类及接口

Struct Event实现了调度器,可以根据优先级来调度事件的处理代码。

new()方法初始化并创建一个调度器。

add_source()方法是将需要监听的事件注册到调度器中。

run()及rloop()方法执行调度器,开始监听、调度。

4.3.2 Trait Source

Trait Source定义了统一的行为,只有实现了这些接口的事件类型才能被Event调度器纳管。

trait及接口

Struct Event实现了调度器,可以根据优先级来调度事件的处理代码。

fd()给出需要监听的fd。

epoll_filter()指定要监听fd上的事件类型,如EPOLLIN、EPOLLOUT等。

priority()设置事件的优先级。

dispatch()监听到事件后,被调度器调度执行的业务代码。

4.4 Trait Sources

Mod Sources下包含若干实现了trait Source的事件类型,如IO,timer,signal等。用户通过直接定义或封装该对象,其实体可以被Event调度。

4.4.1 设计思路

各种事件类型,根据实际的用途对trait Source进行封装,如signal类型,通过创建signalfd,将所要监听的事件统一挂靠到该fd中,然后将fd注册到event中,从而实现其功能。

每一个Timer事件可以创建一个timerfd,但由于系统中的文件句柄数目有限,一种好的方案是为每种类型的时钟源创建一个timefd,然后自身设置一个调度算法来管理timer,只需少量的fd便可以完成timer事件的驱动。

其他类型的事件类型。

4.5 特性下的非功能需求设计

NA

5 可靠性/可用性/Function Safety设计

NA

6 安全/隐私/韧性设计

NA

7 特性非功能性质量属性相关设计

NA

8 数据结构设计(可选)

本章节完成数据库结构的设计(数据库表结构,可以使用Power Designer完成),可选章节。

9 词汇表

词汇表
名称 描述

10 其它说明

NA

11 参考资料清单

请罗列本文档所参考的有关参考文献和相关文档,格式如下:

作者+书名(或杂志、文献、文档)+出版社(或期号、卷号、公司文档编号)+出版日期+起止页码

(1) 张万胜,架构与模块设计.ppt,2009


Last update: March 2, 2023
Created: September 22, 2022