CMDC.Provider.Registry.Broadcaster.PG (cmdc v0.5.1)

Copy Markdown View Source

基于 OTP :pg 模块的零依赖 best-effort broadcaster — cmdc 默认实现。

best-effort 失败语义(评审订正 #2)

  • :pgsend/2-only 协议,无重试、无 ack、无递送保证
  • 网络分区会丢更新;分区恢复后 cmdc 不会自动重放
  • 远端节点崩溃时本节点 send/2 静默丢消息

生产多节点强一致场景请自实现 CMDC.Provider.Registry.Broadcaster 接 Phoenix.PubSub / Redis Streams / NATS 等带 ack 的传输层。

工作机制

  1. setup/1 时把 cmdc Registry GenServer pid :pg.join/2:cmdc_provider_registry group
  2. broadcast/1:pg.get_members/2 取所有节点的 pid(含自身), send/2 派发 {:cmdc_registry_remote, event} 到非本进程的 pid
  3. 远端 cmdc Registry GenServer 的 handle_info({:cmdc_registry_remote, _}, _) 接收消息并写本地 ETS(参见 CMDC.Provider.Registry

适用场景

  • 单机部署:完全等效 Noop(自身 pid 被过滤掉)
  • 同机房 BEAM 集群:无依赖即可用,best-effort 接受
  • 不推荐:跨地域 / 网络分区频繁 / 强一致需求

配置

# 默认配置,不需要显式写
config :cmdc, CMDC.Provider.Registry,
  broadcaster: CMDC.Provider.Registry.Broadcaster.PG

# 自定义 PG group 名(避免与业务 group 冲突)
config :cmdc, CMDC.Provider.Registry,
  broadcaster: CMDC.Provider.Registry.Broadcaster.PG,
  broadcaster_group: :my_custom_group