Go · 分布式 · 无缝大世界

为无缝大世界而生的
分布式游戏服务器框架

channeld 以频道(Channel)为核心模型,原生支持空间分片、跨服 Handover、 AOI 状态同步与内置聊天。服务无状态协作、故障自愈,横向扩容只需加机器。

⬇ 下载 Unity 演示 APK 查看架构 →
8
独立服务角色
3
传输协议 TCP / WebSocket / KCP
4
AOI 查询 Spots / Box / Sphere / Cone
0 感知
跨分片切换客户端无感
Architecture

微服务拓扑,各司其职

全局由 root 注册中心统一监控;公共服(认证 / 入口)与游戏分区服(网关 / 玩家中心 / 空间中心 / 空间负载 / 聊天)完全解耦。 新增一个游戏分区,只需复制一组分区服务——公共服零改动。

channeld 分布式游戏服务拓扑图
TNet 服务拓扑 · 公共服组 + 游戏分区组(可水平复制)
👑
root
注册 / 监控中心
服务注册与发现、节点状态上报、Web 控制台、每日密钥下发与区服列表生成。
🔐
auth
认证服务
用户名 / 邮箱 / 手机三种注册登录,颁发 PIT 令牌,v1.2 起不回传明文 uid。
🚪
gent
游戏入口
验证 PIT 后推送区服列表,附最健康网关地址;角色创建与选择。
⚖️
gtlb
网关负载均衡
客户端直连入口,PIT 鉴权、全局玩家位置、AOI 过滤、消息 fan-out 与断线保存。
👤
pctr
玩家中心
玩家会话管理与角色持久化,MySQL 加载 / 保存。
🗺️
sctr
空间中心
维护全局空间索引,协调分片空间频道创建与跨区 Handover。
🧩
splb
空间负载均衡
按网格分片承载世界数据,跨进程 fan-out 同步玩家状态,边界镜像衔接。
💬
chat
聊天服务
鉴权 / 限频后构造消息,世界 / 区域 / FOV 三频道空间聊天。
Features

框架级能力,开箱即用

空间、同步、聊天、安全、可观测——这些多人游戏的硬骨头,channeld 在框架层全部内置。

🌐

静态网格空间分片

世界在 XZ 平面按 GridCols × GridRows 划分,每个网格对应一个空间频道;服务器再按 ServerCols × ServerRows 分片承载,网格与服务器规模独立伸缩。

StaticGrid2DSpatialChannel
🔄

无缝跨分片 Handover

实体跨网格移动时自动转移实体频道所有权、迁移空间数据并以边界镜像衔接,客户端无切换、无黑屏、无闪烁。

CHANNEL_DATA_HANDOVER镜像衔接
👁️

AOI 兴趣管理

四种区域查询类型按需订阅;fan-out 间隔与延迟、字段掩码、跳过自身回推等订阅选项精细控制带宽。

SpotsBoxSphereCone
📡

多传输 + 压缩

TCP / WebSocket / KCP 三种传输统一内部消息格式,一条代码路径多端接入;Snappy 逐包压缩,WebSocket 网页客户端同样可用。

TCPWebSocketKCPSnappy
🛡️

安全与防护

AuthProvider 可插拔认证;认证失败计数 + IP / PIT 黑名单的 DDoS 防护;频道四级 ACL 控制订阅与数据访问权限。

AuthProviderBlacklistChannel ACL
🔌

断线恢复

服务端连接异常断开自动保留恢复句柄,重连后复用连接 ID、恢复所有者与订阅状态,频道数据补发不丢。

RECOVERY_CHANNEL_DATA订阅恢复
💬

内置空间聊天

世界 / 区域 / FOV(视野半径)三种频道;跨分片场景下由网关按全局位置统一投递,站在分片边界也能和邻区玩家对话。

CCT_WORLDCCT_REGIONCCT_FOV
📊

可观测性

Prometheus 指标按连接 / 频道 / 消息 / 数据包分组统计;pprof 内置性能分析;root 提供 Web 控制台实时查看节点树、FPS 与连接数。

PrometheuspprofWeb Console
🧠

频道数据同步引擎

自定义合并接口替代反射合并,512 条更新缓冲、扇出间隔节流,脏数据按订阅选项精准推送。

MergeableChannelDataFieldMasks
Performance

为高并发而设计的并发模型

Go 原生并发 + 无锁数据结构,热路径上没有全局锁。

每频道独立 goroutine Tick

消息队列与扇出队列由频道自己的协程驱动,单频道慢不影响其它频道。

🔓

xsync 无锁并发 Map

连接与频道的全局索引使用分段无锁 Map,读写不互相阻塞。

📦

累积更新 + 节流扇出

更新先合并进缓冲区,按 FanOutInterval 批量推送,带宽随频率可调而非随消息数线性增长。

🗜️

Snappy 逐包压缩

高频小消息在网络层压缩后传输,单包上限 64KB,压缩类型逐包协商。

🧵

每连接独立读写协程

收发解耦,慢客户端不拖累服务器写循环,FSM 状态机挡掉非法消息序列。

🖥️ 频道模型一览

// 三类频道,覆盖全局 / 空间 / 实体粒度
GLOBAL   // ID 0 · 主服务器拥有,管理所有频道
SPATIAL  // ID ≥ 0x00010000 · 一个网格一个频道
ENTITY   // ID ≥ 0x00080000 · 一个实体一个频道

// 数据包格式(4B 魔数 + 4B 长度 + 1B 压缩位)
"CHNL" | size(BE) | ct | payload

// 扇出选项:精准控制谁在何时收到什么
FanOutIntervalMs  // 推送频率节流
FanOutDelayMs     // 首次扇出延迟
SkipSelfUpdateFanOut
DataFieldMasks    // 字段级过滤

频道状态机:INIT → OPEN → HANDOVER,所有权可在服务器间转移。

Scalability

横向扩容,加机器就完事

所有服务只依赖 root 注册中心,掉线自动重连、systemd 守护自愈; 空间分片从 2×2 起步,网格和服务器维度均可独立扩展。

🧩 框架扩展接口

AuthProvider            // 注入 OAuth / JWT 等自定义认证
SpatialController        // 自定义空间分区策略
MergeableChannelData    // 替代反射的合并逻辑
ChannelDataExtension    // 泛型频道数据扩展
ChannelDataInitializer  // 频道数据默认值
HandoverDataMerger      // 实体→空间数据合并

接口注入而非继承——业务代码不侵入框架内核,升级互不干扰。

📈

分区水平复制

游戏分区组(gtlb / splb / sctr / pctr / chat)作为整体复制即可开新区,公共服零改动。

🧮

分片规模独立伸缩

ServerCols × ServerRows 决定分片数,GridCols × GridRows 决定世界粒度,两者互不耦合。

🩹

全链路自愈

服务断连每 4 秒重试,gtlb 通过 root 的 service_list 动态发现后端;先起网关后起后端也没问题。

🚀

一键 systemd 部署

unit 文件已编码依赖顺序(After / Requires),Restart=always 秒级拉起,标准 Linux 运维栈直接托管。

Demo

Unity 实机演示:走完整个链路

一个 APK 体验 channeld 全部核心能力——从认证到跨分片聊天,全程真实服务器、真实网络。

1

注册 / 登录 auth

用户名密码认证,取得 PIT 令牌与入口地址。

2

选择区服 gent

区服列表由服务端健康度动态生成,直连最优网关。

3

创建角色 gtlb → pctr

种族 / 性别 / 体型 / 职业,角色数据持久化到 MySQL。

4

大世界漫游 splb 分片

多人位置实时同步,走到分片边界无缝切换、镜像玩家平滑过渡。

5

空间聊天 chat

世界 / 区域 / 视野三频道;隔着分片边界,100 米内照聊不误。

🤖

CdUnity 演示客户端

Android APK · 约 157 MB · Unity URP
⬇ 立即下载 APK
安装后连接公网演示服务器即可体验完整流程