Vivid

ClusterContext

运行时 API:GetMembers、InQuorum、Leave、SingletonRef

在 Actor 内通过 ctx.Cluster() 获取 ClusterContext;系统级通过 system.Cluster()。未启用集群时返回 nil,调用前需做 nil 判断。

方法说明

方法签名说明
GetMembers() ([]ClusterMemberInfo, error)返回当前视图中的成员列表;未启用时返回 ErrorClusterDisabled
InQuorum() (bool, error)当前节点是否处于多数派;false 时不应以 Leader 做关键决策
Leave()本节点主动离开集群,优雅下线;幂等,仅执行一次
SingletonRef(name string) (ActorRef, error)返回名为 name 的集群单例的 ActorRef(本地代理),随 Leader 变更自动转发;详见 集群单例

ClusterMemberInfo

GetMembers 返回的成员信息结构:

字段类型说明
Addressstring节点 Remoting 地址(host:port)
Versionstring节点版本号(NodeState.Version)
Datacenterstring数据中心标识
Rackstring机架标识
Regionstring区域标识
Zonestring可用区标识

使用示例

func (a *MyActor) OnReceive(ctx vivid.ActorContext) {
    cluster := ctx.Cluster()
    if cluster == nil {
        return
    }

    members, err := cluster.GetMembers()
    if err != nil {
        if errors.Is(err, vivid.ErrorClusterDisabled) {
            return
        }
        // 处理其他错误(如 Ask 超时)
        return
    }

    for _, m := range members {
        log.Printf("member: %s dc=%s", m.Address, m.Datacenter)
    }

    inQuorum, err := cluster.InQuorum()
    if err != nil {
        return
    }
    if !inQuorum {
        // 当前不在多数派,不应执行关键写操作
        return
    }

    // 执行需要 quorum 保证的操作
}

优雅退出

在系统 Stop 前调用 Leave(),等待「已退出」后再继续:

if system.Cluster() != nil {
    system.Cluster().Leave()
}
system.Stop()

行为说明:Leave() 会阻塞直到本节点已离开集群视图(或超时),之后可安全 Stop。

注意事项

  • GetMembersInQuorum 会访问集群状态,有网络/超时成本,避免高频调用。
  • InQuorum 为 false 时表示可能处于分区或少数派,不应以 Leader 做单例迁移、写仲裁等关键决策。

On this page