Horde 技能用于在 Elixir/Phoenix 应用中搭建基于 Horde 的分布式进程基础设施。Horde 本身提供集群级注册表与动态监督器:通过 Horde 注册的进程在所有 BEAM 节点上唯一,节点加入或离开集群时会自动重新分配。
【使用方式】
技能通过 /horde [subcommand] 调用,包含以下子命令:
bootstrap:为 Phoenix 应用添加 Horde 基础设施add <Module>:为现有 GenServer 添加 Horde 注册singleton <Module>:创建集群级单例 GenServerhelp:显示全部可用子命令
不带子命令调用或使用未知子命令时,会列出可用子命令并停止。
【bootstrap 工作流】
- 读取 mix.exs 与应用 application.ex,识别应用名与现有监督树。
- 在 deps 中添加
{:horde, "~> 0.9"}并执行mix deps.get。 - 创建 HordeRegistry 模块,使用
use Horde.Registry,以members: :auto自动跟踪节点成员。 - 创建 HordeSupervisor 模块,使用
use Horde.DynamicSupervisor,策略为:one_for_one,并带模块允许列表校验(未配置时放行全部模块)。 - 创建 ClusterMonitor 模块,通过
:net_kernel.monitor_nodes/2监听 nodeup/nodedown 事件,按可信域名后缀校验节点,不受信任节点会被断开并记录警告。 - 将三者按序加入监督树,置于 PubSub、Repo 之后、业务 worker 之前。
- 在 config/config.exs 中添加
:horde_allowed_modules配置,可询问用户是否限制可启动模块。 - 可选:若部署于 Fly.io、Kubernetes 等支持 DNS 节点发现的平台,可添加 dns_cluster 依赖并在 runtime.exs 配置
DNS_CLUSTER_QUERY。
【add 工作流】
验证目标模块为 GenServer 且 Horde 基础设施已存在;确定注册键;添加 via/1 辅助函数(构造 {:via, Horde.Registry, {MyApp.HordeRegistry, {:module_key, id}}})、lookup/1 查找函数、ensure_started/1 查找或启动函数、私有 start/1(经 HordeSupervisor 启动并处理 already_started 竞态);更新 start_link 使用 via 元组命名;如有非空允许列表则补充该模块。
【singleton 工作流】
验证或新建 GenServer;确认 Horde 基础设施;添加无参 via/0、ensure_started/0(使用 :permanent 重启策略);更新 start_link 使用 via 命名;必要时更新允许列表。单例在全集群仅运行一个实例,所在节点宕机后由 Horde 在其它节点重启。
【关键约定】
members: :auto自动跟踪 BEAM 节点成员,无需手动配置集群。- 始终处理
{:error, {:already_started, pid}},因为多节点可能同时竞争启动。 - 按需进程用
:transient重启策略,单例用:permanent。 - 监督树顺序:Repo → PubSub → DNSCluster(可选)→ HordeRegistry → HordeSupervisor → ClusterMonitor → 应用 worker。
【适用场景】 需要在多节点 BEAM 集群中保证进程唯一性、跨节点按名查找进程、或在节点变动时自动迁移进程的 Elixir/Phoenix 应用。
【限制】
仅面向 Elixir/Phoenix 生态;需要可用的分布式节点发现机制;示例中的 :my_app 等占位符需替换为实际应用原子。其余未在资料中说明的收费、平台支持或效果信息暂未提供。