菜单

服务生命周期

相关源文件

目的与范围

本文档解释了如何使用 ServiceRunner 框架在 fuel-core 中初始化、管理和关闭服务。它涵盖了主 FuelService 及其组成子服务的生命周期管理,包括状态转换、启动序列和优雅关闭过程。

有关整体架构和服务组合模式的信息,请参阅架构概述。有关事务池或区块生产者等特定服务的详细信息,请参阅其各自的章节。

服务框架架构

fuel-core 中的服务生命周期围绕一个通用框架构建,该框架为所有服务提供一致的生命周期管理。该框架由协同管理服务状态和执行的几个关键特质(traits)和类型组成。

核心服务特质(Traits)

ServiceRunner<S> 是核心组件,它实现了 Service 特质,并管理任何实现了 RunnableService 的类型 S 的生命周期。每个服务都定义了其共享数据类型、任务实现和初始化参数。

来源: crates/services/src/service.rs24-84 crates/services/src/service.rs188-231

状态管理系统

状态管理系统使用 Tokio 的 watch 通道向观察者广播状态变化。StateWatcher 提供了诸如 while_started() 之类的方法,允许服务对状态变化作出反应。

来源: crates/services/src/state.rs6-47 crates/services/src/service.rs323-379

FuelService 作为主编排器

FuelService 作为主编排器,管理多个子服务并协调它们的生命周期。它封装了一个 ServiceRunner<Task>,其中 Task 管理着一系列独立的服务。

FuelService 结构

FuelService 维护对子服务和共享状态的引用,同时将实际的生命周期管理委托给内部的 ServiceRunner<Task>

来源: crates/fuel-core/src/service.rs101-114 crates/fuel-core/src/service.rs416-437

子服务初始化序列

子服务在 init_sub_services 函数中以特定顺序初始化。此序列确保每个服务启动时,其依赖项都已可用。

区块生产者被特意安排在序列的最后创建,以确保在区块生产开始之前所有依赖项都已可用。

来源: 114-526 crates/fuel-core/src/service.rs151-155

服务启动与执行

启动序列

当调用 FuelService::start_and_await() 时,它遵循一个特定的序列,包括创世准备和服务初始化。

创世准备阶段确保在任何服务开始处理之前数据库已正确初始化。

来源: crates/fuel-core/src/service.rs384-388 crates/fuel-core/src/service.rs456-477

任务执行循环

每个服务都实现 RunnableTask 特质,其中包含一个返回 TaskNextActionrun 方法。

TaskNextAction 枚举允许服务指示它们是应该继续运行、优雅地停止,还是在处理错误后继续。

来源: crates/services/src/service.rs86-124 crates/services/src/service.rs169-186

独立服务实现

实现 RunnableService

服务实现 RunnableService 特质以与生命周期框架集成。以下是 GraphQL 服务使用的模式:

GraphQL 服务展示了一种模式:服务结构体持有配置,而 into_task 方法创建具有所需运行时组件的实际可运行任务。

来源: crates/fuel-core/src/graphql_api/api_service.rs130-143 crates/fuel-core/src/graphql_api/api_service.rs164-235

服务特有共享数据

每个服务都定义了自己的 SharedData 类型,该类型可以在组件之间克隆和共享。

全局 SharedState 聚合了各个服务的共享状态,为访问服务功能提供了统一的接口。

来源: crates/fuel-core/src/service.rs73-99 crates/fuel-core/src/service/sub_services.rs470-484

关闭和错误处理

优雅关闭过程

关闭过程确保所有服务以协调的方式停止。

即使未显式调用关闭, FuelServiceDrop 实现也会自动发送停止信号,确保清理。

来源: 116-120 500-514

错误恢复与继续

服务可以根据其配置以不同方式处理错误。

continue_on_error 配置标志允许服务在出现错误后继续运行或为了安全而停止。

来源: 56 94-96