第1页
go语⾔言并发编程实践
以360消息推送系统为例
周洋
部门: 360⼿手机助⼿手
Weibo: @johntech-o Date: 2015.04.25
第2页
⺫⽬目录 go语⾔言在基础服务开发领域的优势? 我遭遇了哪些挑战? 如何应对的?
具有go特⾊色的运维
第3页
在⾼高并发,通信交互复杂,重业务逻辑的分布式系统中,
Go语⾔言优势体现在:开发体验好 、⼀一定量级下服务稳定 、性能满⾜足
需要
第4页
以360消息推送系统为例
⼀一定量级下服务稳定:
50+内部产品,万款开发平台app 实时⻓长连接数亿量级,⽇日独数⼗十亿量级 1分钟内亿量级⼲⼴广播,⽇日下发峰值百亿量级 400台物理机,9个独⽴立集群,国内外近10个IDC 运维管理的go语⾔言编写的常驻service服务实例接近3000个。
业务场景多样:
⽀支持聊天场景业务,稳定⽀支持多款聊天业务app 单通道多app复⽤用 上⾏行通道,回调⽀支持 对智能硬件产品,提供定制化消息推送与转发服务
性能满⾜足需要:
线上单机最⾼高160w⻓长连接 (24核 E5-2630 @ 2.30GHz 64G内存 ) qps在2~5w(取决于协议版本,业务逻辑,接⼊入端⺴⽹网络状况) 测试环境,可以通过300w⻓长连接压测(⺴⽹网络,连接稳定,⽆无带宽限制,实际可以更⾼高 ,决定于⼲⼴广播时候业务内存开销的cpu消耗带来的⼼心跳或者业务延时能否接受)
第5页
⾼高并发、通信交互复杂Android IOS Windows Linux
Iframe
for
ever Web
Flash
接入客户端
Dispatcher Service
Room
Service
Proxy
Service
Register Service
Saver Service
Router Service Session Service
Center Service
Id Service (deprecat
Keeper/Agent Zookeeper/deployd
ed) /Logger
Service
Coordinator Service
第6页
消息系统规模架构:重业务逻辑
消息系统简要架构
接⼊入层
Android
IOS
Windows
Linux
Iframe
for
ever Web
Flash
单实例,单端⼝口,多协议复⽤用
全双⼯工,单客户端,多app复⽤用服务单通道
DES+RSA/ ECC+AES/ crossdomain.xml/ /
适⽤用于复杂环境下的⺴⽹网络的接⼊入策略
Http/ PB/
0~ 6
Kick
Transfer
< un> regi ster
room/ register/ session
协议完备、简单、数据安全、可扩展/ 、省/流量 ZooKeeper/ Keeper Coordinator
/
/
RPC /
/ /
Admin
/
push
第7页
⾼高并发、通信交互复杂Android IOS Windows Linux
Iframe
for
ever Web
Flash
接入客户端
Dispatcher Service
Room
Service
Proxy
Service
Register Service
Saver Service
Router Service Session Service
Center Service
Id Service (deprecat
Keeper/Agent Zookeeper/deployd
ed) /Logger
Service
Coordinator Service
第8页
长连接客户端
写读
认证或注册的io调 用
客户端关注的 阻塞io逻辑,放 心阻塞执行不 用担心阻塞线 程,调度器会 帮忙调度其他 可执行协程
内部接⼜⼝口发送数据
/
加载离线消息
第9页
开发体会的对⽐比
Golang开发
C语⾔言开发
按⽤用户来思考问题,按⽤用户数量开协程,对 Oneloop per thread原则,⼈人为控制线程数
⼀一个⽤用户⾄至少有两个协程为其服务
量,使⽤用epoll+timefd+eventfd来做⽤用户io控
制,超时控制,对⽤用户的通知
io是阻塞执⾏行的,直接设置deadline,调度 对于所有io操作建⽴立的fd映射到指定loop,同
器会对阻塞的协成进⾏行调度,deadline到了,时记录上下⽂文关系进⾏行回调设置,超时控制
阻塞解除,超时出错
使⽤用timefd
推荐使用通过channel与其他⽤用户通信
使⽤用eventfd事件通知的⽅方式,根据epoll获取 的fd绑定的回调函数和参数进⾏行回调操作
对外的通信采取阻io或者也可以go出去,不 对外通信信全局消息list,在映射到的
阻塞主循环
eventloop上开连接池进⾏行消耗
第10页
⺫⽬目录 go语⾔言在基础服务开发领域的优势? 我遭遇了哪些挑战? 如何应对的?
具有go特⾊色的运维
第11页
问题与瓶颈
第12页
问题与瓶颈
单机内存占⽤用
⾼高达69G GC 3~6s
第13页
问题与瓶颈
问题与瓶颈
瓶颈
散列在协程⾥里⾯面的io
buffer和 对象不复⽤用
第14页
问题与瓶颈
问题与瓶颈
奔放的协程使⽤用
瓶颈
散列在协程⾥里⾯面的io
⺴⽹网络环境不好 引起激增
第15页
问题与瓶颈
问题与瓶颈
2~3s的GC
奔放的协程使⽤用
瓶颈
散列在协程⾥里⾯面的io
接⼝口响应速度 降低,重试 增多,压⼒力倍增
第16页
问题与瓶颈
问题与瓶颈
内存暴涨 2~3s的GC
奔放的协程使⽤用
瓶颈
散列在协程⾥里⾯面的io
io阻塞, 协程激增
第17页
问题与瓶颈
问题与瓶颈
瓶颈
第18页
⺫⽬目录 go语⾔言在基础服务开发领域的优势? 我遭遇了哪些挑战? 如何应对的?
具有go特⾊色的运维
第19页
经验⼀一
go语⾔言程序开发需要找到⼀一种平衡,既利⽤用协程带来的便利性⼜又做适当
集中化处理 套路:任务池集中数据合并请求、连接池+pipeline 利⽤用全双⼯工特性
第20页
性能优化:io集中处理
性能优化
通信库
第21页
性能优化:io集中处理
通信库
第22页
性能优化:数据集中处理
第23页
性能优化:数据集中处理
第24页
经验⼆二
go语⾔言开发追求开销优化的极限,谨慎引⼊入其他语⾔言领域⾼高性能
服务的通⽤用⽅方案
关注:内存池、对象池使⽤用与代码可读性与整体效率的权衡
第25页
性能优化:通⽤用⽅方案
性能优化
内存池
第26页
性能优化:通⽤用⽅方案
性能优化
对象池
第27页
⺫⽬目录 go语⾔言在基础服务开发领域的优势? 我遭遇了哪些挑战? 如何应对的?
具有go特⾊色的运维
第28页
go语⾔言运维管理⽅方⾯面的独特魅⼒力……
go语⾔言原⽣生提供的各组⼯工具,构建分布式系统配套设施⽅方⾯面,提供了 便利
配套设施= 测试 + 调优 + 监控 + 运维 便利 = 原⽣生profiling⼯工具 + 开协程模拟测试终端+协程协作模拟业务
第29页
具有go语⾔言特⾊色的运维
Æ 可视化平台 Profiling可视化
将常规排查问题从⼿手⼯工经验化,变成流程化的过程 ⽐比较不同时间维度,两次上线后,进程的各种状态 对于优化上线的效果,可评估(上线新功能发现问题与后续确定KPI神器)
第30页
具有go语⾔言特⾊色的运维:以项⺫⽬目为例
性能可视化
第31页
具有go语⾔言特⾊色的运维
Æ 可视化平台 Profiling可视化
将常规排查问题从⼿手⼯工经验化,变成流程化的过程 ⽐比较不同时间维度,两次上线后,进程的各种状态 对于优化上线的效果,可评估(上线新功能发现问题与后续确定KPI神器)
通信库状态可视化
Æ 最接近业务场景的百万级别压测后台
第32页
架构迭代
所有实例组通信数据监控
第33页
架构迭代
性能监控与调优 压测平台
第34页
具有go语⾔言特⾊色的运维: 配置管理
push
拆分多实例
l
缓解GC压⼒力(gc时间减少40%)
按业务类型聚类,⼲⼴广播(io密集),多播,点对点(内部通信密集),聊天室(cpu密集) 分层服务,按层次扩展改为分集群(Set/Cell思想),各⾃自独⽴立,⼜又具备全被全部功能⼦子集群
l
按业务拆分(助⼿手,卫⼠士,浏览器) l
按功能拆分(push,聊天,嵌⼊入式产品) l
按IDC拆分 (zwt,bjsc,bjdt,bjcc,shgt,shjc,shhm,Amazon Singapore)
拆解后带来管理成本,引⼊入(zookeeper + deployd)/ (Keeper + Agent) 对各节点进⾏行管理
l
监控集群 l
控制组件⾏行为(⽤用户重定向) l
连接监控
第35页
具有go语⾔言特⾊色的运维
Æ 配置⽂文件管理与监控
后台->⽣生成配置⽂文件->全部服务器->调⽤用deployd接⼝口,重启或者reload zookeeper-> 动态修改配置⽂文件 -> 各个服务器上实例通过sdk订阅 profiling 接⼝口 —> 后台定期获取->调⽤用go pprof⽣生成⽂文件->存储 通信库实时数据http接⼝口-> 后台定期获取-> 进⼊入数据库,展⽰示
第36页
具有go语⾔言特⾊色的运维
Æ ⼯工具 -> ⽣生成项⺫⽬目公共⽂文件夹下的.go 配置⽂文件 Æ 客户端sdk -> keeper通信 告知⾝身份-> 原⼦子性的换掉全局配置⽂文件 Æ 客户端sdk->集成profiling功能-> keeper调⽤用并存储 Æ 客户端sdk-> ⾃自定义信息(通信库信息) -> keeper调⽤用并存储 Æ keeper本地保持所有客户端状态信息,按时间和需求获取其他富信息,
提供接⼝口给后台 Æ 所有组件都必须通过⺴⽹网络启动,通过agent调⽤用命令⾏行
第37页
架构迭代
第38页
总结回顾
go语⾔言在基于并发协作的,重业务逻辑的基础服务⽅方向⾮非常适⽤用
适⽤用 = 开发体验好 + 服务稳定 + 性能满⾜足需要
go语⾔言程序开发需要找到⼀一种平衡,既利⽤用协程带来的便利性⼜又做适当集中化处理 套路 = 按请求和业务逻辑并⾏行+任务池集中数据合并请求 + 连接池集中收发
go语⾔言开发追求开销优化的极限,谨慎引⼊入其他语⾔言领域⾼高性能服务的通⽤用⽅方案 内存池+对象池使⽤用 与 代码可读性与整体效率的权衡
go语⾔言原⽣生提供的各组⼯工具,构建分布式系统配套设施⽅方⾯面,提供了便利 ⽣生态圈 = 测试 + 调优 + 监控 + 运维 便利 = 原⽣生profiling⼯工具 + 通信库集成监控+协程协作模拟业务压测
第39页
谢 谢!
北京奇虎科技有限公司