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