# 自定义算法和存储方案
# 概述
damocles 希望在提供一套健壮的算力生产方案的同时,允许使用者最大限度地根据实际情况调配和定制自己的使用方式,其中就包括自定义算法和存储方案。
例如,使用者可以选择:
- 使用开源的优化算法
- 购买付费授权的闭源算法
- 购买外包计算服务
- 使用对象存储(如 S3)作为自己的持久化存储方案
等,并将这些定制方案以极小的成本集成到 damocles 中。
# 使用
对于自定义算法和存储方案的使用,SP
和开发者需要关注不同的内容。这里我们会分开阐述。
# SP
对于 SP
来说,只需要关注如何将自定义的内容集成到算力生成过程中。这里主要分成多个部分:
# damocles-worker 上的 ext-processors
关于 damocles-worker 上的 ext-processors,可以通过以下步骤集成:
- 准备好符合交互协议的可执行文件
- 在 damocles-worker 配置文件中的
[[processors.{stage_name}]]
块中正确地配上要启用的阶段、可执行文件位置、参数、环境变量等 - 启动 damocles-worker 并检查自定义外部处理器的工作情况
这部分内容可以参考:
# damocles-manager 上的 ext-provers
damocles-manager 上涉及算法定制的只有 wining post 和 window post 两部分,这两部分可以以 ext-prover 的形式进行定制,起作用机制、使用方法和 ext-processors 都很相似。
这部分内容可以参考:
09.独立运行的 poster 节点#ext-prover-执行器
# 自定义存储方案
自定义存储方案可以是完全的非文件系统存储方案,如对象存储等,也可以是基于传统的大规模文件系统方案的简化,如将 NFS 挂载简化为一种自定义的轻量数据访问方式。
相比 ext-processors、ext-provers 来说,支持自定义存储相对来说要复杂一些,这种复杂度主要体现在:
- 对自定义存储的支持涉及到多个场景,如扇区封装过程中的数据持久化阶段、扇区升级过程中的原始数据访问阶段、winning post、window post 等。
- damocles-manager 和 damocles-worker 都涉及到和存储实例的一些交互行为。
简单来说,为了能够使用某种自定义存储方案,需要至少进行:
- 为 damocles-worker 配置支持这种存储方案的
transfer
阶段 ext-processor - 为 damocles-manager 配置支持这种存储方案的 winning post 和 window post ext-prover
- 为 damocles-manager 配置支持这种存储方案的 objstore 插件,参考 04.damocles-manager 的配置解析
在具备上述条件后,damocles 即可基于定制化的存储方案工作。
# 开发者
对于开发者来说,最重要的事情是按照 damocles 已经定义好的一系列接口和协议,开发出适用的自定义组件,如外部处理器、golang 插件等。
# ext-processors / ext-provers
从开发层面来说,ext-processors 和 ext-provers 是同一类实现,使用在了不同的场景中。
它的基本原理,是一个可执行文件,满足:
- 父进程通过 stdin / stdout 进行交互
- 符合 vc-processors (opens new window) 定义的交互协议和数据格式
开发者可以通过以下步骤了解基本的开发过程:
- 了解原理和机制,参考 vc-processors: examples (opens new window)
- 为需要定制的阶段实现相应的算法,参考 vc-processors: builtin/processors (opens new window)
- 将已经实现的算法封装成可执行程序,参考 vc-worker: subcommand/processors (opens new window)
# damocles-manager objstore plugin
它本质是 golang 的 plugin,满足:
- 满足 golang plugin (opens new window) 的要求和限制
- 符合 damocles-manager objstore (opens new window) 定义的接口和语义
开发者可以通过以下步骤了解基本的开发过程:
- 了解 damocles-manager 插件框架 (opens new window)
- 了解接口定义和运作方式,参考:damocles-manager objstore: Store (opens new window) 和 objstore: spi (opens new window)
- 了解范例实现 damocles-manager: plugin/fsstore (opens new window)