# 自定义算法和存储方案

# 概述

damocles 希望在提供一套健壮的算力生产方案的同时,允许使用者最大限度地根据实际情况调配和定制自己的使用方式,其中就包括自定义算法和存储方案。

例如,使用者可以选择:

  • 使用开源的优化算法
  • 购买付费授权的闭源算法
  • 购买外包计算服务
  • 使用对象存储(如 S3)作为自己的持久化存储方案

等,并将这些定制方案以极小的成本集成到 damocles 中。

# 使用

对于自定义算法和存储方案的使用,SP 和开发者需要关注不同的内容。这里我们会分开阐述。

# SP

对于 SP 来说,只需要关注如何将自定义的内容集成到算力生成过程中。这里主要分成多个部分:

# damocles-worker 上的 ext-processors

关于 damocles-worker 上的 ext-processors,可以通过以下步骤集成:

  1. 准备好符合交互协议的可执行文件
  2. 在 damocles-worker 配置文件中的 [[processors.{stage_name}]] 块中正确地配上要启用的阶段、可执行文件位置、参数、环境变量等
  3. 启动 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 来说,支持自定义存储相对来说要复杂一些,这种复杂度主要体现在:

  1. 对自定义存储的支持涉及到多个场景,如扇区封装过程中的数据持久化阶段、扇区升级过程中的原始数据访问阶段、winning post、window post 等。
  2. damocles-manager 和 damocles-worker 都涉及到和存储实例的一些交互行为。

简单来说,为了能够使用某种自定义存储方案,需要至少进行:

  1. 为 damocles-worker 配置支持这种存储方案的 transfer 阶段 ext-processor
  2. 为 damocles-manager 配置支持这种存储方案的 winning post 和 window post ext-prover
  3. 为 damocles-manager 配置支持这种存储方案的 objstore 插件,参考 04.damocles-manager 的配置解析

在具备上述条件后,damocles 即可基于定制化的存储方案工作。

# 开发者

对于开发者来说,最重要的事情是按照 damocles 已经定义好的一系列接口和协议,开发出适用的自定义组件,如外部处理器、golang 插件等。

# ext-processors / ext-provers

从开发层面来说,ext-processors 和 ext-provers 是同一类实现,使用在了不同的场景中。

它的基本原理,是一个可执行文件,满足:

开发者可以通过以下步骤了解基本的开发过程:

  1. 了解原理和机制,参考 vc-processors: examples (opens new window)
  2. 为需要定制的阶段实现相应的算法,参考 vc-processors: builtin/processors (opens new window)
  3. 将已经实现的算法封装成可执行程序,参考 vc-worker: subcommand/processors (opens new window)

# damocles-manager objstore plugin

它本质是 golang 的 plugin,满足:

开发者可以通过以下步骤了解基本的开发过程:

  1. 了解 damocles-manager 插件框架 (opens new window)
  2. 了解接口定义和运作方式,参考:damocles-manager objstore: Store (opens new window)objstore: spi (opens new window)
  3. 了解范例实现 damocles-manager: plugin/fsstore (opens new window)