腾讯大讲堂58 拍拍app platform中间件解决方案简介

Preview:

Citation preview

腾 讯 大 讲 堂

第五十八期

研发管理部

大讲堂主页: http://km.oa.com/class与讲师互动: http://km.oa.com/group/class

拍拍 AppPlatform中间件解决方案简介

电子商务部

鲁锋 (henrylu)

2009-02-14

大纲

系统原理

灵活部署

快捷开发

PaiPai 后台服务的整体架构

CGI AppServer

DBServer DBMS

DBServer DBMS

App ServerWeb Server

DB Server

需要状态机支持

App Server 内部协议流转四种模式

纯转发

Statless Statful 1

和多个DBServer通讯

对协议流转的顺序有

严格要求

Statful 2

发送不需要Response的协议包

Statful 3

和多个DBServer通讯

对协议流转的顺序没有

要求(常用于数据统计 )

App Server 开发模式

App Server业务需求 映射 协议路由分发代码

协议解析代码

业务逻辑代码

底层IO代码

重复代码

映射到 AppPlatform 中间件架构

业务代码

底层代码

Services

Container

映射到AppPlatform

设计

WWW

Web Server(C++)LW-HttpdHTTP

Web Container

Web Service

Config Agent

Query Route

App Server(C++)NetIO

App Container

App ServiceTCP

Java ServerTomcat

Spring

Java Service

App Platform (AppContainer AutoGen)

Stub4Web SkelSerialize

AutoGen

IDL

Stub4Java

AutoGen 框架代码生成工具 ( C++ h 数据源)

数据源解析器

Meta 树

C++ 工程

模板

Java 工程

模板

C++ 工程

框架

Java 工程

框架

模板替换

模板替换

AutoGen

AutoGen 框架代码生成工具 ( Java IDL 数据源)

Java IDLIDL解析器

Meta 树

C++ 工程

模板

Java 工程

模板

C++ 工程

框架

Java 工程

框架

模板替换

模板替换

AutoGen V5

SVNIDLIDLIDL

使用eclipse

使用命令行

AutoGenPlugIn

AppPlatform 中间件部署架构——传统两层架构

DBUser

DBUser

DBUser

MSGQ DBMS

DBEval

DBEval

DBEval

MSGQ DBMS

DBItem

DBItem

DBItem

MSGQ DBMS

Netio MSGQTCP

一台物理机器

ControllorMSGQ

Web层(CGI)

AppPlatform 部署架构——传统三层架构

Netio MSGQTCP

AppUser

AppUser

AppUser

MSGQMSGQ

AppEval

AppEval

AppEval

MSGQMSGQ

AppItem

AppItem

AppItem

MSGQMSGQ

DBUser

DBUser

DBUser

MSGQ DBMS

DBEval

DBEval

DBEval

MSGQ DBMS

DBItem

DBItem

DBItem

MSGQ DBMS

一台物理机器

ControllorMSGQ

TCPMsgQ BackNetio

Netio MSGQTCP

一台物理机器

ControllorMSGQ

Web层(CGI)

AppPlatform 部署架构——大 APP 架构

Netio MSGQTCP

AppUser

AppUser

AppUser

MSGQMSGQ

AppEval

AppEval

AppEval

MSGQMSGQ

AppItem

AppItem

AppItem

MSGQMSGQ

DBUser

DBUser

DBUser

MSGQ DBMS

DBEval

DBEval

DBEval

MSGQ DBMS

DBItem

DBItem

DBItem

MSGQ DBMS

一台物理机器

ControllorMSGQ

Web层(CGI)

推荐

传统 Statful 状态机的实现Int OnExecute()

{

switch(m_cStat)

{

case S_START:

OnWebRequest(WebRequest[out]);

// Do Something…

DoDB1Request(DB1Request[in]);

m_cStat = S_CHECK_1; return 1;case S_CHECK_1:

OnDB1Response(DB1Response[out]);// Do Something… DoDB2Request(DB2Request[in]);m_cStat = S_CHECK_2; return 1;

case S_CHECK_2:OnDB2Response(DB2Response[out]);// Do something…DoWebResponse(WebResponse[in]);m_cStat = S_FINISH; return 0;

} // … return 0;

}

Statful DB1

DB2

S_START

S_CHECK_1

S_CHECK_2

优化后的 Statful 状态机的实现Int OnExecute(){

OnWebRequest(WebRequest[out]); // Do Something…

CallDB1(DB1Request[in], DB1Response[out]); // Do Something… with DB1Response

CallDB2(DB2Request[in], DB2Response[out]); // Do Something… with DB2Response

DoWebResponse(WebResponse[in]);

// …return 0;

}奥妙就在此:CallDB1(DB1Request[in], DB1Response[out]){

DoDB1Request(DB1Request[in]); Schedule();// Linux System Call swapcontext(…)OnDB1Response(DB1Response[out]);

}

Statful DB1

DB2

谢谢大家!

问题?

Recommended