Erlang Distribution 介绍
用途
Erlang 内置的分布式能力支持跨多个节点构建集群化、容错的系统。不同节点上的进程通过本地相同的消息传递原语透明通信,这种位置透明性使分布式编程自然且直接。分发层自动处理网络通信、序列化和节点连接。节点通过命名相互发现,进程可通过注册名或 pid 引用全局寻址。理解分发模式对于构建可扩展、有韧性的系统至关重要。
本技能涵盖节点连接与集群、分布式消息传递、全局名称注册、分布式监督、网络分区处理、RPC 模式以及构建生产级分布式应用。
节点连接
节点连接形成集群,用于分布式计算和容错。示例包括:启动命名节点(erl -name node1@hostname -setcookie secret 或 erl -sname node2 -setcookie secret)、连接节点(net_kernel:connect_node/1)、列出已连接节点([node() | nodes()])、监控节点连接(net_kernel:monitor_nodes(true) 并接收 nodeup/nodedown 消息)、启动分布式(net_kernel:start([mynode, shortnames]) 与 erlang:set_cookie/2)、隐藏节点连接(net_kernel:hidden_connect_node/1)以及获取节点信息(名称、cookie、节点列表、是否存活)。节点连接支持构建具有自动发现的分布式集群。
分布式消息传递
使用与本地消息相同的语法向远程节点上的进程发送消息。示例包括:向远程节点上的注册进程发送消息({Name, Node} ! Message)、在远程节点上派生进程(spawn(Node, Fun) 或 spawn(Node, Module, Function, Args))、分布式请求-响应(派生远程进程并发送 {self(), Ref},接收 {Ref, Result} 或超时)、分布式工作分发(work_dispatcher 模块选择节点并派生工作进程)、以及远程进程的 group leader 设置以输出。位置透明消息传递实现无缝分布式通信。
全局名称注册
在分布式集群中全局注册进程名称。示例包括:全局注册(global:register_name/2)、向全局注册进程发送消息(global:whereis_name/1)、带冲突解决的全局注册(global:register_name/3 使用 ResolveFun 保留节点名较小的进程)、全局同步(global:sync/0)、列出全局注册名(global:registered_names/0)、以及节点重连后重新注册(ensure_global_registration)。全局注册实现位置无关的进程发现。
分布式监督
跨多个节点监督进程,实现集群范围的容错。示例包括:分布式监督者模块(distributed_supervisor,使用 supervisor 行为,start_worker/1 在指定节点启动工作进程)、工作进程模块(worker,spawn_link 到指定节点)、以及分布式进程组(pg_example,使用 pg 模块加入组和广播)。分布式监督在节点故障时维持系统健康。
RPC 与远程执行
在远程节点上执行函数调用,支持多种调用模式。示例包括:基本 RPC(rpc:call/4)、带超时的 RPC(rpc:call/5)、异步 RPC(rpc:async_call/4 与 rpc:yield/1)、并行 RPC 到多个节点(rpc:multicall/4 与 rpc:multicall/5)、Cast(rpc:cast/4)、广播到所有节点(rpc:multicall 使用 [node() | nodes()])、以及跨节点并行 map(pmap_nodes)。RPC 提供便捷的远程执行,具有位置透明性。
网络分区与 CAP
处理网络分区并理解 CAP 定理的权衡。示例包括:检测网络分区(比较预期节点与当前节点,返回缺失节点)、分区修复策略(partition_handler 监控集群,在节点恢复后调用 heal_partition 执行 global:sync)、以及多数共识(consensus 模块提议值并收集投票,多数通过则成功,否则无多数或超时)。分区处理策略在网络故障期间维持系统可用性。
最佳实践
本地集群使用短名称,互联网范围分发使用长名称;在可信集群的所有节点上设置相同 cookie 以确保安全;监控节点连接以检测和处理网络分区;谨慎使用全局注册,因为它增加协调开销;实现分区检测和修复策略以增强韧性;为分布式系统设计最终一致性,接受 CAP 限制;简单调用使用 RPC,复杂协议优先使用消息传递;使用 toxiproxy 或混沌工程等工具测试网络故障;在分布式调用上实现适当的超时以处理慢网络;使用分布式监督维持跨节点的容错。
常见陷阱
未设置 cookie 会导致节点无法连接,造成静默失败;到处使用全局注册表会创建单点故障和瓶颈;不处理节点断开会导致进程无限挂起;假设网络可靠会在分区期间导致错误行为;RPC 调用中使用长超时会在故障期间造成级联延迟;不测试网络分区会遗漏关键故障模式;忘记在分区修复后同步全局注册表;在多台机器上使用相同节点名会导致冲突;不监控节点健康会阻止检测集群状态退化;在分布式环境中依赖严格一致性违反 CAP 定理。
何时使用本技能
在构建需要高可用性和容错的系统时应用分发;对需要自动故障转移的关键服务使用分布式监督;利用多个节点实现超越单机限制的水平可扩展性;当地理分布带来延迟优势时实现分布式系统;使用集群在多个服务器之间分配负载;应用分发模式构建有韧性的微服务架构。
资源
Erlang Distribution Protocol、Distributed Erlang、Learn You Some Erlang - Distributed OTP、Designing Distributed Systems、CAP Theorem Explained。