- 1、本文档共48页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
开源毫秒服务引擎的设计与实现培训课件
开源毫秒服务引擎的设计
与实现
QQ团队开发运营实践
毫秒思路
目录
毫秒亮点
QQ后台团队演进
毫秒功能
毫秒思路
目录
毫秒亮点
QQ后台团队演进
毫秒功能
QQ后台团队演进
黄金时代
对美好的追求让我们创造了毫秒
青铜时代
约50人的开发团队,开发运营高度依赖
开发和运维
白银时代
约200人的开发团队,重点服务集
中化,开发运营流程规范化
模块B的一个实例
模块A的一个实例
后端模块B
基于Tag-Length-Value
的二进制协议
模块B路由Agent
定期获取模块
B路由配置更新
青铜时代
模块A
多进程异步框架
获取后端B的可用实例
模块B路
由配置中心
名字发现和路由服务
每个后端模块提供自己的Agent
Agent标准化:目录/配置/共享内存id冲突
各个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化,无法自动生成打解包代码
重复代码
无法体现程序员的“价值”
各种奇葩的bug
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 (auto it = Tags.begin(); it !=
Tags.end(); it++)
{
PACK_PUT_UINT16(p, *it);p+=2;
}
struct UserBasicInfo
{
std::string sNick;
uint16_t wFaceId;
uint32_t dwBirthDate;
};
…
for (uint16_t i = 0; i wTagNum; i++) {
PACK_GET_TLV(tlv, p);
switch(tlv.tag) {
//依据Tag反填UserBasicInfo里的字段
}
}
请求
根据Tag进行扩展,如获取用户的简单资料
请求:dwQQ + wTagNum + wTag1 + … + wTagN
回包:wTagNum + (wTag1 + wLen1 + sValue1) + …+(wTagN + wLenN + sValueN)
回包
异步IO
发送
//新建一个上下文,用户自行放入更多信息
Context* ctx = new Context();
//生成唯一seq
ctx-seq = gen_seq();
//后端模块B请求打包,填入seq
PackModuleB(ctx-seq, req_str);
//通过Agent API获取后端模块B的地址
GetAddr(ModuleB_ID, (ctx.srvaddr));
//框架异步发包API
AsyncSend(ModuleB_ID, ctx, req_str);
回包继续处理
//框架异步回包处理流程
int HandleResponse(Context* ctx, int iID, void* pPkg, int
iPkgLen) {
if(iID == ModuleB_ID) {
UnPackModuleB(pPkg, iPkgLen);
//逻辑继续处理...
}
DelContext(ctx);
}
//框架异步超时处理流程
int HandleTimeout(Context* ctx, int iID) {}
当一个业务逻辑需要调用10+个后端模块时,代码复杂度成几何倍数上升!
优点
缺点
名字发现服务和路由服务
服务容错
可运维性差;Agent容错能力参差不
齐
TLV协议
可扩展强
重复编码
异步IO远程调用
高性能
随业务流程复杂度增加,代码可读性
和可维护性随成倍数下降
监控和告警
业务定制上报;短信和邮件告警
监控点、告警点设置依赖开发意识;
告警多运维累
日志
有本地和远程日志;有染色能力
定位问题效率低
文档评论(0)