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

下载本文档

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

文档简介

1、开源毫秒服务引擎的设计与实现QQ团队开发运营实践毫秒思路目录毫秒亮点QQ后台团队演进毫秒功能毫秒思路目录毫秒亮点QQ后台团队演进毫秒功能QQ后台团队演进黄金时代对美好的追求让我们创造了毫秒青铜时代约50人的开发团队,开发运营高度依赖开发和运维白银时代约200人的开发团队,重点服务集中化,开发运营流程规范化模块B的一个实例模块A的一个实例后端模块B基于Tag-Length-Value的二进制协议模块B路由Agent定期获取模块B路由配置更新青铜时代模块A多进程异步框架获取后端B的可用实例模块B路由配置中心名字发现和路由服务每个后端模块提供自己的AgentAgent标准化:目录/配置/共享内存id

2、冲突各个Agent容错能力不一当模块需要调用10+个后端模块时开发/运维集体跳起来了模块A多进程异步框架模块B0路由Agent模块B1路由Agent.模块Bn路由Agent模块A的一台服务器Tag-Length-Value协议根据Tag进行扩展,如获取用户的简单资料请求:dwQQ + wTagNum + wTag1 + + wTagN回包:wTagNum + (wTag1 + wLen1 + sValue1) + +(wTagN + wLenN + sValueN)没有IDL化,无法自动生成打解包代码重复代码无法体现程序员的“价值”各种奇葩的bugTag-Length-Value协议charb

3、uf64=0;char *p=buf;PACK_PUT_UINT32(p, dwQQ);p+=4;PACK_PUT_UINT16(p, Tags.size();p+=2;for (auto it = Tags.begin(); it !=Tags.end(); it+)PACK_PUT_UINT16(p, *it);p+=2;struct UserBasicInfostd:string sNick;uint16_t wFaceId;uint32_t dwBirthDate; for (uint16_t i = 0; iseq = gen_seq();/后端模块B请求打包,填入seqPackMo

4、duleB(ctx-seq, req_str);/通过Agent API获取后端模块B的地址GetAddr(ModuleB_ID, &(ctx.srvaddr);/框架异步发包APIAsyncSend(ModuleB_ID, ctx, req_str);回包继续处理/框架异步回包处理流程int HandleResponse(Context* ctx, int iID, void* pPkg, intiPkgLen) if(iID = ModuleB_ID) UnPackModuleB(pPkg, iPkgLen);/逻辑继续处理.DelContext(ctx);/框架异步超时处理流程i

5、nt HandleTimeout(Context* ctx, int iID) 当一个业务逻辑需要调用10+个后端模块时,代码复杂度成几何倍数上升!优点缺点名字发现服务和路由服务服务容错可运维性差;Agent容错能力参差不齐TLV协议可扩展强重复编码异步IO远程调用高性能随业务流程复杂度增加,代码可读性和可维护性随成倍数下降监控和告警业务定制上报;短信和邮件告警监控点、告警点设置依赖开发意识;告警多运维累日志有本地和远程日志;有染色能力定位问题效率低服务路径/命名/配置/工具/文档等没有统一标准开发自由发挥J运维低效青铜时代反思集中化服务白银时代模块A多进程协程框架后端模块BProtobuf

6、协议名字发现和路由Agent模块A的一个实例定期更新后端服务的路由配置获取后端服务的可用实例名字发现和路由服务发布管理统一监控统一日志业务树后端服务扩缩容更新路由模块B的一个实例白银时代反思RPC!RPC!RPC!标准化开发运营体系积重难返集中化服务后端模块BProtobuf RPC 协议定期更新后端服务的路由配置获取后端服务的可用实例名字发现和路由服务发布管理统一监控统一日志业务树后端服务扩缩容更新路由集中化控制台黄金时代模块A多进程协程RPC框架名字发现和路由Agent模块A的一个实例模块B的一个实例毫秒思路目录毫秒亮点QQ后台团队演进毫秒功能毫秒的设计思路标准化开发运营集中化管理立体化引

7、擎自由与相互伤害过度自由=相互伤害?模块提供独立的名字发现服务路由agent公共逻辑没有抽象或组件化服务目录、配置、工具、文档没有统一标准关键的监控/日志项上报依赖开发意识从控制台下载业务开发代码实现具体业务逻辑毫秒标准化开发rpc GetList(GetListRequest) returns (GetListResponse);制定IDL协议int CMainLogicServiceMsg:GetList(constGetListRequest* request, GetListResponse* response)/* TODO 业务逻辑实现,request/response为业务业务定

8、义的protobuf协议格式* 业务可使用框架自带的监控系统ATTR_REPORT(test), 详见monitor.h*业务可使用框架自带的日志系统NGLOG_DEBUG(test),详见srpc_log.h*/return 0; 毫秒标准化开发 RPC调用int CMainLogicServiceMsg:GetList(const GetListRequest* request,GetListResponse* response):crawl:GetListRequest req;:crawl:GetListResponse resp;req.set_type(request-type()

9、;/后端模块请求包/后端模块返回包/后端模块请求包设置int ret = CallMethod(VOA.Crawl,/*后端模块路由名字*/crawl.CrawlService.GetList,/*RPC函数名*/req, resp, /*请求包和返回包反填*/20000, PORT_TYPE_TCP); /*超时时间和网络类型*/ret非0为后端模块收包异常;为0进行后续业务逻辑/return 0;毫秒标准化部署上传新的业务插件版本制定发布计划进行发布页面展示发布结果#服务标准化部署根目录#C+服务,一级业务名|- MainLogic|- bin#二级业务名#框架、工具及业务插件路径|- l

10、ib#框架依赖库及业务外部代码库/资源文件#配置文件路径#日志路径#PHP服务,一级业务名| |- etc| - log|- VOA_php|- MainLogic|- bin|- lib- php#PHP插件路径|- etc| - log- agent#集中化服务Agent路径业务服务路径示例/msec|- VOA_cpp集中化管理配置管理协议管理(IDL)外部代码库/资源文件业务版本容量管理服务IP列表扩容/缩容管理发布管理发布版本管理及一键回滚发布列表运营层面业务层面监控集中业务监控单机监控机器基础监控日志集中日志上报立体化引擎立体化引擎 毫秒RPC调用CallMethod(VOA.Cr

11、awl, crawl.CrawlService.GetList, req,resp, 20000, PORT_TYPE_TCP);通过名字发现和路由服务获取可用实例,并自动容错通过协程发起网络请求,获得和异步调用接近的性能监控上报:请求量,失败率,超时率,平均时延,请求时延区间抽样日志上报,用于展示服务调用关系链RPC调用流程毫秒思路目录毫秒亮点QQ后台团队演进毫秒功能毫秒服务引擎架构名字发现和路由服务远程命令数据传输服务集中化服务管理页面远程agentC+/Java/PHP毫秒开发框架路由agent开发&运维Rediscluster数据服务#1Rediscluster数据服务#2.R

12、ediscluster数据服务#NWeb运维管理服务基于redis cluster 的k-v集群监控agent日志agent其中一台业务实例监控服务日志服务集中化控制台毫秒服务引擎展示1. 创建新模块,定义IDL2. 获取开发代码3. 开发并生成插件4. 上传插件及外部代码库/资源文件5. 制定发布计划6. 观察监控和日志毫秒服务引擎展示1. 创建新模块,定义IDL2. 获取开发代码3. 开发并生成插件4. 上传插件及外部代码库/资源文件5. 制定发布计划6. 观察监控和日志毫秒服务引擎展示1. 创建新模块,定义IDL2. 获取开发代码3. 开发并生成插件4. 上传插件及外部代码库/资源文件5

13、. 制定发布计划6. 观察监控和日志int CMainLogicServiceMsg:GetTitles(const GetTitlesRequest*request, GetTitlesResponse* response):crawl:GetTitlesRequest req;:crawl:GetTitlesResponse resp;req.set_type(request-type();int ret = CallMethod(VOA.Crawl, crawl.CrawlService.GetMP3List, req, resp, 20000,PORT_TYPE_TCP);/ret非0

14、为后端模块收包异常;为0进行后续业务逻辑,组response包返回response.set_msg(resp-msg();return 0;毫秒服务引擎展示1. 创建新模块,定义IDL2. 获取开发代码3. 开发并生成插件4. 上传插件及外部代码库/资源文件5. 制定发布计划6. 观察监控和日志毫秒服务引擎展示1. 创建新模块,定义IDL2. 获取开发代码3. 开发并生成插件4. 上传插件及外部代码库/资源文件5. 制定发布计划6. 观察监控和日志毫秒服务引擎展示1. 创建新模块,定义IDL2. 获取开发代码3. 开发并生成插件4. 上传插件及外部代码库/资源文件5. 制定发布计划6. 观察监

15、控和日志毫秒思路目录毫秒亮点QQ后台团队演进毫秒功能毫秒服务引擎亮点? 高性能协程RPC框架? 服务容错? 过载保护? 调用链框图? 多开发语言? KV管理平台高性能协程 微线程框架? 微线程状态机初始化可运行运行中等待? 上下文管理部分寄存器(callee save)、调用栈,私有栈帧? 事件调度Epoll I/O事件驱动无抢占,无优先级结束服务容错模块A模块B实例B1IDC1模块B实例B3IDC3模块B实例B2IDC2模块A轮询调用模块B:如果没有容错:成功率降至66.7%网络中断或实例异常模块A模块B实例B1IDC1模块B实例B3IDC3模块B实例B2IDC2模块A轮询调用模块B:如果实

16、施了容错:成功率维持99.9%+网络中断或实例异常请求上涨50%,那么模块B如果要做到IDC容灾,需要冗余50%实例服务容错策略? 快速屏蔽实例? 通过探测包缓慢增加权重,恢复屏蔽实例? 后端容量计算及过载保护从socket接收缓冲区接收用户请求进行本地逻辑处理发送请求到后端模块B,等待后端模块B返回接收后端模块B的应答应答前端用户,回到步骤1处理下一个请求模块A的处理流程前端用户过载介绍什么是过载?为什么要保护?系统接收缓冲区业务处理逻辑模块B系统发送缓冲区模块A超时时间1s超时时间100ms峰值请求量30/s平均时延20ms过载场景前端用户业务处理逻辑模块B系统接收缓冲区系统发送缓冲区模块

17、A超时超时时间1s超时时间100ms峰值请求量200/s1.? 模块B进行了新特性发布,请求平均处理时延从20毫秒延长至50毫秒2.? 操作失败的用户往往会重试,socket接收缓冲区一直保持满的状态3.? 当一个用户请求被追加到缓冲区里后,要等待50秒才能被进程A取出来处理平均时延50ms缓冲区平均缓存1000个请求没有过载保护的服务1009080706050403020100业务成功率在此刻过载9080706050403020100实施了过载保护的服务业务成功率100在此刻过载过载保护策略及早拒绝拒绝无效超时请求(T2-T0T超时间隔)处理中继续拒绝超时请求(T2.X-T0T超时间隔)控制

18、向后端模块重试的频率系统缓冲区T0操作系统接收框架请求队列工作进程处理回包给请求端T1框架接收T2工作进程接收T3完成处理T4回包给请求端请求包时序调用链框图客户端FriendListSvc.GetFriendList上报量:352平均耗时:53msIMSvc.FriendListSvcFriendDBPxySvc. GetFriendList上报量:352平均耗时:21msIMSvc.FriendDBPxySvc12调用链框图示例IMSvc.FriendListSvc客户端FriendListSvc.GetFriendList上报量:352平均耗时:53msIMSvc. UserInfoSvcIMSvc.FriendDBPxySvcIMSvc. StatusSvcUserInfo.GetBasicInfo上报量:343平均耗时:23msStatusSvc.GetUserStatus上报量:343平均耗时:18msFriendDBPxySvc. GetFriendList上报量:352平均耗时:21ms1332调用

温馨提示

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

评论

0/150

提交评论