AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

GO语言并发编程实践 by 周洋@360手机助手

发布者 gopher   简介 Gopher
发布于 1430372672098  浏览 7119 关键词 Go, 并发 
分享到

第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页

谢 谢!

北京奇虎科技有限公司



支持文件格式:*.ppt, *.pptx, *.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。