海量在线游戏基于服务网格平滑演进
如果无法正常显示,请先停止浏览器的去广告插件。
1. 海量在线游戏基于服务网格
平滑演进
陈智伟
腾讯光子欢乐游戏工作室/公共后台技术负责人/专家工程师
2. 陈智伟
请插入您的照片
腾讯 12 级后台专家工程师,现负责欢乐
游戏工作室公共后台技术研发以及团队管
理工作,擅长微服务分布式架构设计以及
游戏后台研运
3. 目录
背景介绍
介绍做网格化的背景和意义
CONTENTS
架构演进过程
按架构模块逐个拆解介绍演进过程
成效总结
分享网格化的效果和心得
4. 背景介绍
5. 欢乐游戏工作室概览
欢乐游戏工作室旗下拥有欢乐斗地主、欢乐麻将等数款国民棋牌游戏,
拥有海量在线用户。与此同时,也在研 MMO 大世界,SLG 等多种品
类游戏。
6. 原有架构概述
欢乐工作室的游戏后台架构是全区全服的分布式微服务架构
同机部署
自研存储
有状态服务
• 自研一套数据缓存服务
私有 TCP 协议
消息中转服
HTTP 协议
周
边
业
务
Dispatch
消息分配服务
Apache
3
…
客户端接入网关
…
中转层
• 负责微服务进程之间的消息转发,充当着路由中转,因此整
A
2
…
1
存储层
个架构是星型拓扑
业务层
• 多套研发框架,不同进程模型,积累了数百种微服务
• 存在较多有状态服务
接入层
• 使用自研客户端接入网关处理 TCP 私有协议的接入
• 使用 Apache 处理 HTTP 协议的接入
欢乐工作室全区全服分布式微服务架构
1 CGI 同步开发框架,单机多进程
2 协程开发框架,单机多进程
3
异步开发框架,单机单进程
承载着多款游戏,支撑着百万级在线和千万级 DAU,
且持续平稳地运行了近十年,但也存在较多问题
7. 原有架构的问题和挑战
01.服务治理能力不足 02.服务运维成本高 03. 开发框架成熟度低 04.巨量微服务维护困难
• • • •
流量调度能力简陋:因为耦合
资源利用率极低:为应对业务
易用性差:框架封装较弱,开
种类多,维护成本极高:现网
在开发框架、接入层和中转层 流量变化,大量冗余部署,集 发框架虽多,但均不够好用, 积累了千余种服务,数量多,
之中,使用和维护成本较高 群 CPU 峰值利用率不足 15% 且不易维护 大部分服务需要人工介入维护
• 缺乏服务可观测能力:全局服
• 运维乏力:在应对扩容、 裁撤、
• 不合理的进程部署模型:大量
务质量可视化能力较差,导致 节点异常、容灾等问题时,都 的同机多进程的部署,资源隔
问题排查效率低下 需要人工深度参与操作 离性较差,时常互相影响
•
组织架构分拆引发问题:业务
膨胀,组织架构分拆,但运行
服务相互牵扯,难以分拆,不
同团队间影响问题频发
随着业务持续发展,原有架构的基础能力、可维护性、易用性等等都亟待提升
8. 如何改造架构
不可行方案
• 小修小补:在现有架构上继续打补丁优化,但维护
成本极高,将越陷越深,并非长久之计
• 彻底重构:使用成熟的架构进行重构,但存量业务
太多,改造成本巨大,根本无法接受
期望以较低的改造成本,来获得成熟、可靠且可持续演进的服务管理和治理能力
使用 Istio 将服务管理和服务治理能力下沉,让现有框架逐渐退变为业务的逻辑驱动层和胶
水层,升级现有架构
Istio
腾讯服务网格(TCM)
9. 架构演进
10. 新增的无状态服务实现网格化部署
增加网格适配网关 MeshGate
核心能
力
实现网格内外服务消息互通
gRPC
云上服务A
云上服务B
私有协议
双向代理
• 代理网格内服务注册至云下客户端接入网关与消息中转服
• 代理网格外服务作为云上访问云下服务网关
MeshGate
协议互转
•
云下
私有协议与 gRPC 协议互转适配
实现收
益
新服务可在网格中部署
快速享受网格红利
• K8s 的服务部署管理能力
• Istio 的服务治理能力
存量无状态服务如何平滑迁移入网格?
Istio
消息
中转服
客户端
接入网关
云下服务1
云下服务2
网格内外互通示意图
11. 如何迁移存量的无状态服务
进程框架改造
业务
逻辑
线程
2
业务消息通道
gRPC 协议
02
引入gRPC适配
• 多线程引入
• 业务消息投递给 gRPC 线程
gRPC Wapper
•
在私有协议外包一层 gRPC
私有协议
gRPC Wapper
1
业务进程
01
存量业务代码重编即适配 gRPC 协议
进程框架改造示意图
利用消息中转服实现平滑迁移
01
灰度流量
网格内服务B
网格外服务A
适配 gRPC 线程
利用消息中转服转发部分流量
•
持续观察稳定性,实现平滑过渡网格
适配 gRPC 线程
消息中转服
MeshGate
50% 流量
50% 流量
02
全量
如同新增的无状态服务
• 同网格内通信采用 gRPC 协议
• 同网格外通信采用 MeshGate 中转
网格外服务B
流量灰度示意图
12. 小结
架构引入 MeshGate 快速实现无状态服务网格化迁移
开发框架支持和适配 gRPC 无状态服务的资源成本下降 70%
sidecar
自研存储
云下 Istio
链路变长——2 跳变 5 跳
迁移部分
返回链路也变长,时延还要翻倍
有状态服务
性能损耗较大,MeshGate 成为瓶颈
消息中转服
私有 TCP 协议
在游戏核心交互场景中无法接受
HTTP 协议
客户端接入网关
1
2
2
1
Dispatch
4
Apache
…
B
…
gRPC 协议
5
周边业务
3
活动A
活动B
接入网关
客户端接入网关迁移网格
13. 原有客户端接入网关
用户链接管理
核心功能
身份鉴权,心跳保活,反向通知等
运维能力弱,资源利用率极低
发布需要人工调度和长链接排空,全量发布持续数天时间
部署不便,需冗余部署,日常高峰期 CPU 利用率仅 15%
支持 TCP 长短链接,WebSocket
问题分析
消息路由
流量治理能力不足
Random,轮询,业务定制化路由等
不支持 Http 接入,无染色能力,熔断能力等
将接入网关直接部署在网格中,就能快速网格化,解决问题么?
业务线程
5
4
转2
适配gRPC线程
SideCar
• 时延略微改善,性能未解决
反序列化6
序列化5
业务线程
反序列化4
SideCar
适配 gRPC
转1
2 MeshGate
1
客户端接入
网关
转2
适配gRPC线程
反序列化6
反序列化2 序列化5
序列化1
3
4
序列化3
3
2
SideCar
序列化3
SideCar
适配 gRPC
1
反序列化4
客户端接入网关
反序列化2
转1
接入网关 2 私有协议
Pod
转换为 gRPC
时延:5 跳变 4 跳
性能:gRPC 协议栈转换以及组解包性能
开销较大,但整体次数没变
客户端
接入网关
• 开发成本并不低
接入服本身需要对链接做复杂管理,但
gRPC 工程封装封闭,想直接管理原始链
接很繁琐
序列化1
上行消息
3 解析 gRPC Head
向后端路由
Envoy
Kernel 协议栈
1
• 实现个性化路由复杂
•
路由完全依赖 SideCar
Lotus Pod 的请求处理模型
gRPC
14. 如何改造接入网关
使用 Envoy 支持私有协议接入
• 性能时延不敏感服务
业务线程
转换 gRPC 协议栈,原生流量调度
适配 gRPC 线程
SideCar
适配 gRPC 线程
SideCar
适配 gRPC
2
客户端
接入网关
SideCar
Envoy
3
1
使用私有协议转发
不劫持业务侧入流量
但损失部分流量治理以及观测能力
业务服务
SideCar
Envoy
4
[1]
接入网关+MeshGate [2]
接入网关部署在网格内 [3]
Envoy 私有协议接入 [4]
Envoy 私有协议转发
5 跳 4 跳 3 跳 2 跳
协议转换 2 次 2 次 2 次 0 次
gRPC
协议栈 6 次 6 次 4 次 0 次
指标
时延
性能
业务线程
方案
客户端
接入网关
gRPC 协议
端
私有协议
适配 gRPC 线程
SideCar
MeshGate
业务线程
SideCar
适配 gRPC
• 性能时延敏感服务
15. 如何改造 Envoy
01
02
数据面扩展 Filter Chains
兼容业务已有能力
控制面扩展 xDS
适配私有协议路由规则
私有协议转换 gRPC
私有协议解析
业务鉴权
Filter chains
自定义路由
业务层
熔断、限流
业务加解密
转发给
filter
自定义 Controller
管理 Envoy Router 的运维
Envo
y
MsgRouter
CRD
kind: MsgRouter
spec:
msgid: 100000
svrName: test.serviceA
port: 12345
2
转发路由
xDS
MsgRouter
Controller
Router
Listener
...
1. 私有协议
1
03
Kernel 协议栈
数据面扩展
2.gRPC
Pilot
Envoy
xDS
Pilot Agent
控制面扩展
Envoy Router——处理请求流量模型
16. 实现成效
压测数据
方案
QPS 峰值 P50 耗时 P99 耗时
原始接入网关直连 150,000 4ms 9ms
原始接入网关+ MeshGate(网格) 30,000 34ms 50ms
Envoy 私有协议接入,gRPC 转发 60,000 7ms 13ms
Envoy 私有协议接入,私有协议转发 120,000 5ms 9ms
2 倍
2 倍
4 核 8 G,对应的线程根据资源模型做相应的调整,使用平均 300 字节的业务协议压测
性能和时延效果改善明显,使用 Envoy 私有协议接入和转发与原始接入网关相近
时延
接近
17. 小结
解决敏感业务时延和性能要求
将Envoy改造成网格接入网关
接入服的资源成本减少 50%
大幅提升接入服务的治理能力
sidecar
自研存储
云下 Istio
迁移部分
有状态服务
有状态服务 GameSvr
消息中转服
私有 TCP 协议
如何进网格?
HTTP 协议
客户端接入网关
Dispatch
Apache
…
B
…
gRPC 协议
周边业务
活动A
Envoy Router
活动B
18. 原有 GameSvr 架构
负责玩家对局撮合和对局逻辑的服务
多层业务架构
有状态服务
消息路由特殊
多个游戏 用户长 Session 定点路由
每个游戏下多种玩法 使用共享内存做数据缓存 全双工,非请求应答式
每种玩法下多个版本 服务需热更新,冷启动慢
调度管理复杂
•
数百个不同能力的
GameSvr 节点,针对它
们做负载压力管理和对局
调度十分繁琐
云下 GameSvr 问题
01
服务运维繁琐且低效
02
资源利用率极低
• 上架一个节点需人工操作 10 多次 • 冗余部署,平均利用率不足 20%
• 每年应对机器裁撤需投入 1 个月 • 不同节点负载高低差距大
• 宕机还需人为介入,MTTR 长
19. 如何改造 GameSvr 架构
• 自定义 Controller 管理
• 多层 CRD:游戏、玩法、版本、
GameSvr
03
镜像预热
停旧容器
起新容器
自定义 Workload
01
部署能力
GameSvr
GameGroup
智能自动伸缩
• 实时预测:突增流量
• 离线预测:周期性流量
• 定时扩容:定点流量
优化单局调度
• 容器热更新 • 撮合外置
• Group 间金丝雀、蓝绿发布 • 自动感知实时部署和Pod状态
• Group 内可控滚动更新 • 结合负载预测
02
04
20. 小结
重构 GameSvr 架构模型
GameSvr 资源成本减少 75%
自定义 Controller 管理
实现运维能力自动化,大幅提升效率
实现智能 HPA
sidecar
自研存储
云下 Istio
自研存储和存量巨大的
迁移部分
CGI 服务如何进网格?
有状态服务
消息中转服
私有 TCP 协议
HTTP 协议
客户端接入网关
Dispatch
Apache
…
…
活
gRPC 协议
周边业务 GameSvr
活动A 活动B
Envoy Router
21. 自研存储服务迁移
自研存储迁移至云存储,交给专业团队维护,增强存储能力,降低维护成本
迁移步骤
自研存储
Master
业务服务
MySQL
自研存储
Slave
消息中转服
4
02 同步热数据 通过自研存储备机同步热数据
CloudDBAdapter 适配代理自研存储的私有协议至云存储服务
通过 CloudDBAdapter 转发,使得云存储服务中有业务热数
据
3
2
CloudDB
Adapter
01 适配协议 研发无状态适配代理服务
03 导入冷数据 人工将冷数据离线导入云存储
04 全量校验无误,切换数据访问路由
如果云存储服务已经有数据,说明是最新的,则不覆盖
CloudDB
1
改造迁移示意图
切换路由
全量数据逐条比对,通过后切换消息中转服路由,即完成搬迁
22. 如何网格化存量巨大 Apache CGI
云下 Apache CGI 问题
吞吐极低:同步阻塞框架 隔离性差:同机超多进程部署
稳定性差:负载波动大,易过载 存量巨大:五百余种 CGI
根据流量大小,实施不同改造方案
v 5% 头部流量:协程化
v
80% 长尾流量:整体 CGI 打包镜像
改造虽耗时,但数量少。大幅提升吞吐能力,并减
少资源开销。
v
15%
普通流量:单独 CGI 打包镜像
改造成本较低。在资源开销和可维护性之间寻求平
衡。
无需改造,但也不影响业务。同时减少对集群 IP、
内存以及路由配置等等资源的占用
收益
快速实现网格化
资源成本减少 70%
稳定性提升
23. 小结
全量服务平滑演进入网格
SideCar 性能问题
内存占用过高
sidecar
自研存储
CPU 开销占比过大
云下 Istio
CloudDB
迁移部分
有状态服务
消息中转服
私有 TCP 协议
CGI A CGI B
周边业务 GameSvr
活动A 活动B
HTTP 协议
客户端接入网关
Dispatch
Apache
…
…
A
gRPC 协议
Envoy Router
24. SideCar 的性能问题——内存篇
只部署千余个 Pod,SideCar 的平均内存就接近普通业务容器,约 500M 左右,且还有
持续增长的态势
未优化前 Pod 容器
内存占比
资源占用过多
业务容器
58%
SideCar
42%
影响 Pod 调度
OOM 或驱逐
相当于业务内存整体翻 SideCar 内存占比过高 内存持续增长,加上流
番,并且实际上内存还 且持续增长,对 HPA 伸 量上来之后,有可能超
随 Pod 数量在持续增加, 缩计算以及调度节点 过原先预设的 limit 限制,
最终开销可能无法接受 CPU/内存计算都有影响 导致 OOM 或者驱逐。
25. 为什么内存占用这么大
原因之一:默认全量下发 xDS 数据
• Istio 会将全量服务发现数据(xDS)下发给每一个 SideCar
• 即便是完全不会对外产生请求的服务,它的 SideCar 也存放着全量 xDS 数据
• 集群规模越大,数据量越大,同时 xDS 变化还易引发 CPU 开销抖动
xDS 根据服务按需加载
测试一个完全没有请求的 Pod,其 SideCar 内存也有 500M
使用 SideCar CRD 限制服务可见性
• 无 xDS 时,通过 lazy xDS Egress 转发
• Lazy xDS Controller 分析所需 xDS,并同步给该 SideCar
• 有 xDS 后,走点对点通信,并实时监听所需 xDS 变化
• 以 namespace 为维度限制服务可见性
• 跨 namespace 服务调用,需显式指定
优点
简便快速
原生支持
支持多集群
不足
优点
无需设置依赖关系
粒度依然较粗 无侵入
需要梳理依赖关系 实现精细化的 xDS 管理
Lazy
不足
暂不支持私有协议
使用开源项目 Aeraki Lazy xDS 方案
26. 为什么内存占用这么大
负载均衡性
原因之一:一致性Hash导致的问题
• 默认 ring hash 算法,使用 uid 作为一致性 hash key,虚拟节点少,导致负载不够均衡
• 调整 ring hash 虚拟节点至 10 万个,导致内存开销过大(100个真实节点,一个环大概
占用 2M 左右)
数据迁移量
默认改用 Maglev Hash 算法,减少虚拟节点数量
查找效率
一致性 hash 算法的权衡
原因之一:设置不合理的监听端口
• 不同的业务和框架,使用的端口种类和数量都不同
• 基础 helm 模板上设置监听端口,最终所有服务都开了这些端口
• 网格会为这些监听端口都创建 xDS,也会在 SideCar 上建环,内存开销很大
优化效果
SideCar 内存占用减少了 70%
统一相同作用的监听端口,端口按需开启
27. SideCar 的性能问题——CPU篇
未优化前流量型 Pod
CPU 平均开销占比
未优化前大扇出 Pod
CPU 开销占比
SideCar CPU 开销过大
业务容器
50%
SideCar
50%
大部分情况之下,不需要复杂的流量治理能力
SideCar
业务容器
74%
26%
原因分析
5
10
响应1
4
11
Envoy
请求1
12
业务进程
3
2
业务
逻辑
线程
1 9 8 7
Envoy
请求方 Pod
01
6
业务
逻辑
线程
业务进程
响应方 Pod
gRPC
编解码次数过多
•
•
在一次普通的 Req、
请求
解包
普通请求应答流程示意图
响应
gRPC
协议栈开销较大
•
通过热力图分析,发
Rsp 有 12 次之多 现主要还是 Envoy 的
大部分只是在适配 gRPC 协议栈的开销
Istio 原有协议体系
组包
02
•
加乘编解码次数,总
体开销过大
28. SideCar 的性能问题——CPU篇
减少编码次数 减少协议栈开销
使用 gRPC proxyless 使用开销极小的私有协议栈
4
响应
2
业务
逻辑
线程
3
业务进程
业务进程
响应方 Pod
请求方 Pod
请求
1
业务
逻辑
线程
1
xDS 处理
业务
逻辑
线程
业务进程
2
请求
xDS 处理
响应
解包
3
4
响应方 Pod
请求方 Pod
响应
业务进程
Envoy
Envoy
基于原始码流的偏移读取或设置字段
请求
组包
业务
逻辑
线程
请求
响应
使用私有协议栈
gRPC proxyless 示意图
优点
优点
• 跳数明显减少,性能提升明显
不足
• 业务进程会融入 xDS 相关信息
• 不同开发框架的接入和维护不便
• 个人认为从某种意义上脱离网格最初的
设计理念
• 业务原生支持;节省业务进程内的适配开销
• 减少转换适配以及跳数
• 默认不完全解包,基于原始码流的偏移读取或设置字段
不足
• Istio 本身缺乏一个良好的七层协议扩展机制,
对接控制面和数据面成本较高
使用 Aeraki 解决私
有协议对接 SideCar
问题
29. 使用 Aeraki 支持私有协议
核心能
力
Aeraki Meta Protocol 是一种网格中通用协议适配框架,可在 Service Mesh 中管理任意七层协议
对接数据面
•
提供服务发现、负载均衡、熔断、路由、权限控制、限流、故障注入等公共的基础能力
对接控制面
•
提供 MetaProtocol Proxy 配置和 RDS 配置下发,以实现高级路由和服务治理能力,例如流量拆分、灰度/蓝绿发布、地域感知负载均衡、流量镜像和基于角色的权限控制。
接入开发简便
•
只要进行少量二次开发,便可在 mesh 中接入支持私有协议
方案
原生 Sidecar —— gRPC 协议栈
MetaProtocol Sidecar —— 私有协议栈
QPS 峰值
15000
70000
4.6 倍
2 核 8 G,对应的线程根据资源模型做相应的调整,使用平均 300 字节的业务协议压测 Sidecar 配置 2 个 worker 线程
30. 小结
解决了云上 SideCar 问题,真正实现全面平滑演进入网格
sidecar
自研存储
云下 Istio
CloudDB
迁移部分
有状态服务
消息中转服
私有 TCP 协议
CGI A CGI B
周边业务 GameSvr
活动A 活动B
HTTP 协议
客户端接入网关
Dispatch
Apache
…
…
A
gRPC 协议
Envoy Router
31. 成效总结
32. 核心成效总结
升级架构和团队技术 大幅减少资源成本
通过网格化,我们对过去积累
了十年的业务系统进行重构,
高效的 DevOps 能力
强大的服务治理能力
以及可观测性
资源利用率峰值从 15% 左 通过自动化和标准化的服务网 服务网格不仅加强了服务治理,
右,提升至 55% 左右; 格,以及定制化的Controller, 支持流量控制、故障注入和安
实现微服务架构和团队技能的 资源使用量减少了 60%; 我们降低了人工干预,显著提 全策略等功能。同时,它提高
全面提升。这不仅只是服务的 仅资源成本每年节省数百 高了DevOps效率和研运一体化。 了可观测性,包括监控、追踪
万; 这有助于实现快速迭代、故障 和日志,有助于微服务架构的
排查,确保系统的稳定性和可 稳定运行。
容器化和网格化,还从一个封
闭的体系融入技术社区,实现
技术的快速迭代更新。
减少 60%
靠性。
总之,我们在一个历史包袱异常沉重的游戏业务复杂架构中,通过细致分析和改造,完成整体架构的
平稳平滑上云以及网格化;提升资源利用率,提高研运效率,沉淀游戏各类业务场景上云经验。
33. 感谢倾听
Q&A
34.