QQ高效团队开发实践:开源毫秒服务引擎的设计与实现PPT课件_第1页
QQ高效团队开发实践:开源毫秒服务引擎的设计与实现PPT课件_第2页
QQ高效团队开发实践:开源毫秒服务引擎的设计与实现PPT课件_第3页
QQ高效团队开发实践:开源毫秒服务引擎的设计与实现PPT课件_第4页
QQ高效团队开发实践:开源毫秒服务引擎的设计与实现PPT课件_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

开源毫秒服务引擎的设计与实现 QQ团队开发运营实践 1 毫秒思路 目录 毫秒亮点 QQ后台团队演进 毫秒功能 2 毫秒思路 目录 毫秒亮点 QQ后台团队演进 毫秒功能 3 QQ后台团队演进 黄金时代对美好的追求让我们创造了毫秒 青铜时代约50人的开发团队 开发运营高度依赖开发和运维 白银时代约200人的开发团队 重点服务集中化 开发运营流程规范化 4 模块B的一个实例 模块A的一个实例 后端模块B 基于Tag Length Value的二进制协议 模块B路由Agent 定期获取模块B路由配置更新 青铜时代模块A多进程异步框架获取后端B的可用实例 模块B路由配置中心 5 名字发现和路由服务每个后端模块提供自己的AgentAgent标准化 目录 配置 共享内存id冲突各个Agent容错能力不一当模块需要调用10 个后端模块时开发 运维集体跳起来了 模块A多进程异步框架模块B0路由Agent模块B1路由Agent 模块Bn路由Agent模块A的一台服务器 6 Tag Length Value协议 根据Tag进行扩展 如获取用户的简单资料请求 dwQQ wTagNum wTag1 wTagN回包 wTagNum wTag1 wLen1 sValue1 wTagN wLenN sValueN 没有IDL化 无法自动生成打解包代码重复代码无法体现程序员的 价值 各种奇葩的bug 7 Tag Length Value协议 char buf 64 0 char p buf PACK PUT UINT32 p dwQQ p 4 PACK PUT UINT16 p Tags size p 2 for autoit Tags begin it Tags end it PACK PUT UINT16 p it p 2 structUserBasicInfo std stringsNick uint16 twFaceId uint32 tdwBirthDate for uint16 ti 0 i wTagNum i PACK GET TLV switch tlv tag 依据Tag反填UserBasicInfo里的字段 请求 根据Tag进行扩展 如获取用户的简单资料请求 dwQQ wTagNum wTag1 wTagN回包 wTagNum wTag1 wLen1 sValue1 wTagN wLenN sValueN 回包 8 异步IO发送 新建一个上下文 用户自行放入更多信息Context ctx newContext 生成唯一seqctx seq gen seq 后端模块B请求打包 填入seqPackModuleB ctx seq req str 通过AgentAPI获取后端模块B的地址GetAddr ModuleB ID 回包继续处理 框架异步回包处理流程intHandleResponse Context ctx intiID void pPkg intiPkgLen if iID ModuleB ID UnPackModuleB pPkg iPkgLen 逻辑继续处理 DelContext ctx 框架异步超时处理流程intHandleTimeout Context ctx intiID 当一个业务逻辑需要调用10 个后端模块时 代码复杂度成几何倍数上升 9 青铜时代反思 10 集中化服务 白银时代模块A多进程协程框架 后端模块B Protobuf协议 名字发现和路由Agent模块A的一个实例 定期更新后端服务的路由配置 获取后端服务的可用实例 名字发现和路由服务 发布管理 统一监控 统一日志 业务树 后端服务扩缩容更新路由 模块B的一个实例 11 白银时代反思 RPC RPC RPC 标准化开发运营体系积重难返 12 集中化服务 后端模块B ProtobufRPC协议 定期更新后端服务的路由配置 获取后端服务的可用实例 名字发现和路由服务 发布管理 统一监控 统一日志 业务树 后端服务扩缩容更新路由 集中化控制台 黄金时代模块A多进程协程RPC框架 名字发现和路由Agent模块A的一个实例 模块B的一个实例 13 毫秒思路 目录 毫秒亮点 QQ后台团队演进 毫秒功能 14 毫秒的设计思路 标准化开发运营 集中化管理 立体化引擎 15 自由与相互伤害 过度自由 相互伤害 模块提供独立的名字发现服务路由agent公共逻辑没有抽象或组件化 服务目录 配置 工具 文档没有统一标准关键的监控 日志项上报依赖开发意识 16 从控制台下载业务开发代码 实现具体业务逻辑 毫秒标准化开发rpcGetList GetListRequest returns GetListResponse 制定IDL协议intCMainLogicServiceMsg GetList constGetListRequest request GetListResponse response TODO业务逻辑实现 request response为业务业务定义的protobuf协议格式 业务可使用框架自带的监控系统ATTR REPORT test 详见monitor h 业务可使用框架自带的日志系统 NGLOG DEBUG test 详见srpc log h return0 17 毫秒标准化开发 RPC调用 intCMainLogicServiceMsg GetList constGetListRequest request GetListResponse response crawl GetListRequestreq crawl GetListResponseresp req set type request type 后端模块请求包 后端模块返回包 后端模块请求包设置 intret CallMethod VOA Crawl 后端模块路由名字 crawl CrawlService GetList RPC函数名 req resp 请求包和返回包反填 20000 PORT TYPE TCP 超时时间和网络类型 ret非0为后端模块收包异常 为0进行后续业务逻辑 return0 18 毫秒标准化部署 上传新的业务插件版本 制定发布计划进行发布 页面展示发布结果 服务标准化部署根目录 C 服务 一级业务名 MainLogic bin 二级业务名 框架 工具及业务插件路径 lib 框架依赖库及业务外部代码库 资 源文件 配置文件路径 日志路径 PHP服务 一级业务名 etc log VOA php MainLogic bin lib php PHP插件路径 etc log agent 集中化服务Agent路径 业务服务路径示例 msec VOA cpp 19 集中化管理 配置管理协议管理 IDL 外部代码库 资源文件业务版本 容量管理服务IP列表扩容 缩容管理发布管理发布版本管理及一键回滚发布列表 运营层面 业务层面 监控集中业务监控单机监控机器基础监控日志集中日志上报 20 立体化引擎 21 立体化引擎 毫秒RPC调用 CallMethod VOA Crawl crawl CrawlService GetList req resp 20000 PORT TYPE TCP 通过名字发现和路由服务获取可用实例 并自动容错 通过协程发起网络请求 获得和异步调用接近的性能 监控上报 请求量 失败率 超时率 平均时延 请求时延区间 抽样日志上报 用于展示服务调用关系链 RPC调用流程 22 毫秒思路 目录 毫秒亮点 QQ后台团队演进 毫秒功能 23 毫秒服务引擎架构名字发现和路由服务远程命令数据传输服务 集中化服务管理页面 远程agent C Java PHP毫秒开发框架路由agent 开发 运维 Rediscluster数据服务 1Rediscluster数据服务 2 Rediscluster数据服务 N Web运维管理服务基于rediscluster的k v集群 监控agent 日志agent其中一台业务实例 监控服务 日志服务集中化控制台 24 毫秒服务引擎展示 1 创建新模块 定义IDL2 获取开发代码3 开发并生成插件4 上传插件及外部代码库 资源文件5 制定发布计划6 观察监控和日志 25 毫秒服务引擎展示 1 创建新模块 定义IDL2 获取开发代码3 开发并生成插件4 上传插件及外部代码库 资源文件5 制定发布计划6 观察监控和日志 26 毫秒服务引擎展示 1 创建新模块 定义IDL2 获取开发代码3 开发并生成插件4 上传插件及外部代码库 资源文件5 制定发布计划6 观察监控和日志 intCMainLogicServiceMsg GetTitles constGetTitlesRequest request GetTitlesResponse response crawl GetTitlesRequestreq crawl GetTitlesResponseresp req set type request type intret CallMethod VOA Crawl crawl CrawlService GetMP3List req resp 20000 PORT TYPE TCP ret非0为后端模块收包异常 为0进行后续业务逻辑 组response包返回response set msg resp msg return0 27 毫秒服务引擎展示 1 创建新模块 定义IDL2 获取开发代码3 开发并生成插件4 上传插件及外部代码库 资源文件5 制定发布计划6 观察监控和日志 28 毫秒服务引擎展示 1 创建新模块 定义IDL2 获取开发代码3 开发并生成插件4 上传插件及外部代码库 资源文件5 制定发布计划6 观察监控和日志 29 毫秒服务引擎展示 1 创建新模块 定义IDL2 获取开发代码3 开发并生成插件4 上传插件及外部代码库 资源文件5 制定发布计划6 观察监控和日志 30 毫秒思路 目录 毫秒亮点 QQ后台团队演进 毫秒功能 31 毫秒服务引擎亮点 高性能协程RPC框架 服务容错 过载保护 调用链框图 多开发语言 KV管理平台 32 高性能协程 微线程框架 微线程状态机 初始化 可运行 运行中 等待 上下文管理部分寄存器 calleesave 调用栈 私有栈帧 事件调度EpollI O事件驱动无抢占 无优先级 结束 33 服务容错 模块A 模块B实例B1IDC1 模块B实例B3IDC3 模块B实例B2IDC2 模块A轮询调用模块B 如果没有容错 成功率降至66 7 网络中断或实例异常 34 模块A 模块B实例B1IDC1 模块B实例B3IDC3 模块B实例B2IDC2 模块A轮询调用模块B 如果实施了容错 成功率维持99 9 网络中断或实例异常 请求上涨50 那么模块B如果要做到IDC容灾 需要冗余50 实例 服务容错策略 快速屏蔽实例 通过探测包缓慢增加权重 恢复屏蔽实例 后端容量计算及过载保护 35 从socket接收缓冲区接收用户请求 进行本地逻辑处理 发送请求到后端模块B 等待后端模块B返回 接收后端模块B的应答 应答前端用户 回到步骤1处理下一个请求 模块A的处理流程 前端用户 过载介绍什么是过载 为什么要保护 系统接收缓冲区 业务处理逻辑 模块B 系统发送缓冲区模块A 超时时间1s 超时时间100ms 峰值请求量30 s 平均时延20ms 36 过载场景 前端用户 业务处理逻辑 模块B 系统接收缓冲区系统发送缓冲区模块A 超时超时时间1s 超时时间100ms 峰值请求量200 s1 模块B进行了新特性发布 请求平均处理时延从20毫秒延长至50毫秒2 操作失败的用户往往会重试 socket接收缓冲区一直保持满的状态3 当一个用户请求被追加到缓冲区里后 要等待50秒才能被进程A取出来处理 平均时延50ms 缓冲区平均缓存1000个请求 37 没有过载保护的服务1009080706050403020100 业务成功率在此刻过载 38 9080706050403020100 实施了过载保护的服务业务成功率100 在此刻过载 39 过载保护策略 及早拒绝拒绝无效超时请求 T2 T0 T超时间隔 处理中继续拒绝超时请求 T2 X T0 T超时间隔 控制向后端模块重试的频率 系统缓冲区 T0操作系统接收 框架请求队列 工作进程处理 回包给请求端 T1框架接收 T2工作进程接收 T3完成处理 T4回包给请求端 请求包时序 40 调用链框图 客户端FriendListSvc GetFriendList上报量 352平均耗时 53msIMSvc FriendListSvc FriendDBPxySvc GetFriendList上报量 352平均耗时 21msIMSvc FriendDBPxySvc 1 2 41 调用链框图示例 IMSvc FriendListSvc 客户端FriendListSvc GetFriendList上报量 352平均耗时 53ms IMSvc UserInfoSvc IMSvc FriendDBPxySvc IMSvc StatusSvc UserInfo GetBasicInfo上报量 343平均耗时 23ms StatusSvc GetUserStatus上报量 343平均耗时 18ms FriendDBPxySvc GetFriendList上报量 352平均耗时 21ms 1 3 3 2 42 调用链框图示例 客户端FriendListSvc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论