AirJD 焦点
AirJD

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

Go在猎豹移动的应用 by 毛剑

发布者 gopher   简介 Gopher
发布于 1430384819455  浏览 10074 关键词 Go, 移动开发 
分享到

第1页

毛剑



第2页

Why Go?

ž 优雅简洁,少就是多; ž 性能好、系统级语言; ž 静态语言、强类型约束; ž 交叉编译&部署; ž 网络模型&并发同步模型; ž 标准库、内置工具强大支持; ž 开源&社区活跃;



第3页

我们做了啥?

ž 业务

— 猎豹移动全球passport体系; — 游戏开放平台; — 游戏支付体系;

ž 平台

— 基于gopush的推送平台&goim; — 基于redis sentinel的smart client; — rpc框架; — gosnowflake发号器集群; — goconf统一配置管理;



第6页

接入层优化

ž DNS在移动网络下不适用;

— 避免劫持、失效,dns提供商故障;

ž 协议压缩:pb+gzip;

— 节约流量;

ž 协议设计:职责单一不适用;

— 合并请求;

ž TCP Handshake影响RTT;

— keepalived&长连接;

ž API动态加速;

— proxy模式&动态CDN;



第7页

SOA

ž Web站点是PHP开发的,通过RPC交互; ž rpc和api都是基于Go开发的服务; ž 国内DNS->VIP->lvs->tengine->Go; ž 海外DNS->ELB DNS->ELB->Go; ž Service之间通过Thrift或者net/rpc通讯; ž 依赖redis sdk访问redis; ž 直连mysql; ž 用户的所有业务逻辑基于Go处理;



第9页

Service

ž 服务应该是无状态的; ž api服务出现瓶颈的时候,直接scale out; ž graceful restart依赖健康检测; ž api质量监控,使用日志来追踪,通过本

地日志+flume+hdfs+hive; ž 实时监控可以考虑flume sink到kafka,再

依赖Spark计算;



第11页

RPC

ž 协议&远程调用的选型;

— net/rpc,thrift,grpc等;

ž 链路追踪,参考Google Dapper论文,核 心思路是关键库植入代码,因为缺乏 AOP编程支持,我们使用golang blog推 荐的依赖context对象;

ž 服务发现、负载均衡依赖ZK; ž 弹性调度的支持,降级处理、动态扩容;



第12页

RPC选型

ž 是否多语言支持?net/rpc不支持 ž 性能如何? ž thrift num:111324, time:30s, num/s:3710; ž grpc num:159999, time:30s, num/s:5333; ž net/rpc不依赖context,实现数据跟踪,

需要修改源码; ž grpc支持http2,方便移动端app使用;



第15页

Cache

ž 模仿cpu使用多级cache; ž L1 cache:不经常修改,大量访问对性

能要求极致的,我们使用go map缓存信 息,使用COW保证无锁更新和访问; ž 使用redis作为核心的cache store; ž 使用hash mod region方式对cache进行 扩展;



第18页

goconf

ž xml,yaml,json,ini? ž 阶段1:逐idc,逐机器配置修改; ž 阶段2:svn统一提交修改,每个idc一份; ž 阶段3:配置统一管理化(agent模型); ž 一处修改,统一管理; ž 节点状态查看、回滚配置; ž 数据安全、强一致性;



第19页

goconf

/config/ | service/ | idc1/ | current/( {"last_ver":"v1.2", "cur_ver": "v1.1"}) | | section/ | | key-value ( {"value":"xxxx", "comment":"x"})

   | snapshot/ | | v1.1/ (value是整个配置⽂文件) | agent/ | node/( {"ver":"v1.2"})



第22页

gosnowflake

ž 参考twitter snowflake id算法实现; ž 支持datacenter id & worker id(32个); ž 同一个毫秒支持4096的sequence滚动; ž golang重新实现; ž 支持net/rpc级别的failover;



第23页

采坑&建议

ž defer内存占用; ž database/sql 连接一定要设置idle conn; ž database/sql prepare bug; ž gc带来的stop the world; ž := 操作符,以及变量作用域; ž setuid setgid无效; ž map,slice预分配; ž ….



第24页

谢谢



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