腾讯大讲堂第五十八期研发管理部大讲堂主页:与讲师互动:拍拍AppPlatform中间件解决方案简介电子商务部鲁锋(henrylu)2009-02-14大纲系统原理灵活部署快捷开发PaiPai后台服务的整体架构CGIAppServerDBServerDBMSDBServerDBMSAppServerWebServerDBServer需要状态机支持AppServer内部协议流转四种模式纯转发StatlessStatful1和多个DBServer通讯对协议流转的顺序有严格要求Statful2发送不需要Response的协议包Statful3和多个DBServer通讯对协议流转的顺序没有要求(常用于数据统计)AppServer开发模式AppServer业务需求映射协议路由分发代码协议解析代码业务逻辑代码底层IO代码重复代码映射到AppPlatform中间件架构业务代码底层代码ServicesContainer映射到AppPlatform设计(C++)LW-HttpdHTTPWebContainerWebServiceConfigAgentQueryRouteAppServer(C++)NetIOAppContainerAppServiceTCPJavaServerTomcatSpringJavaServiceAppPlatform(AppContainerAutoGen)Stub4WebSkelSerializeAutoGenIDLStub4JavaAutoGen框架代码生成工具(C++h数据源)数据源解析器Meta树C++工程模板Java工程模板C++工程框架Java工程框架模板替换模板替换AutoGenAutoGen框架代码生成工具(JavaIDL数据源)JavaIDLIDL解析器Meta树C++工程模板Java工程模板C++工程框架Java工程框架模板替换模板替换AutoGenV5SVNIDLIDLIDL使用eclipse使用命令行AutoGenPlugInAppPlatform中间件部署架构——传统两层架构DBUserDBUserDBUserMSGQDBMSDBEvalDBEvalDBEvalMSGQDBMSDBItemDBItemDBItemMSGQDBMSNetioMSGQTCP一台物理机器ControllorMSGQWeb层(CGI)AppPlatform部署架构——传统三层架构NetioMSGQTCPAppUserAppUserAppUserMSGQMSGQAppEvalAppEvalAppEvalMSGQMSGQAppItemAppItemAppItemMSGQMSGQDBUserDBUserDBUserMSGQDBMSDBEvalDBEvalDBEvalMSGQDBMSDBItemDBItemDBItemMSGQDBMS一台物理机器ControllorMSGQTCPMsgQBackNetioNetioMSGQTCP一台物理机器ControllorMSGQWeb层(CGI)AppPlatform部署架构——大APP架构NetioMSGQTCPAppUserAppUserAppUserMSGQMSGQAppEvalAppEvalAppEvalMSGQMSGQAppItemAppItemAppItemMSGQMSGQDBUserDBUserDBUserMSGQDBMSDBEvalDBEvalDBEvalMSGQDBMSDBItemDBItemDBItemMSGQDBMS一台物理机器ControllorMSGQWeb层(CGI)推荐传统Statful状态机的实现IntOnExecute(){switch(m_cStat){caseS_START:OnWebRequest(WebRequest[out]);//DoSomething…DoDB1Request(DB1Request[in]);m_cStat=S_CHECK_1;return1;caseS_CHECK_1:OnDB1Response(DB1Response[out]);//DoSomething…DoDB2Request(DB2Request[in]);m_cStat=S_CHECK_2;return1;caseS_CHECK_2:OnDB2Response(DB2Response[out]);//Dosomething…DoWebResponse(WebResponse[in]);m_cStat=S_FINISH;return0;}//…return0;}StatfulDB1DB2S_STARTS_CHECK_1S_CHECK_2优化后的Statful状态机的实现IntOnExecute(){OnWebRequest(WebRequest[out]);//DoSomething…CallDB1(DB1Request[in],DB1Response[out]);//DoSomething…withDB1ResponseCallDB2(DB2Request[in],DB2Response[out]);//DoSomething…withDB2ResponseDoWebResponse(WebResponse[in]);//…return0;}奥妙就在此:CallDB1(DB1Request[in],DB1Response[out]){DoDB1Request(DB1Request[in]);Schedule();//LinuxSystemCallswapcontext(…)OnDB1Response(DB1Response[out]);}StatfulDB1DB2谢谢大家!问题?