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 返回的成员信息结构:
| 字段 | 类型 | 说明 |
|---|---|---|
| Address | string | 节点 Remoting 地址(host:port) |
| Version | string | 节点版本号(NodeState.Version) |
| Datacenter | string | 数据中心标识 |
| Rack | string | 机架标识 |
| Region | string | 区域标识 |
| Zone | string | 可用区标识 |
使用示例
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。
注意事项
- GetMembers 与 InQuorum 会访问集群状态,有网络/超时成本,避免高频调用。
- InQuorum 为 false 时表示可能处于分区或少数派,不应以 Leader 做单例迁移、写仲裁等关键决策。