智付云架构

2017-02-06  本文已影响0人  sim_coie

智付云系统架构及配置

1.系统架构说明

本文档描述的智付云系统架构脱胎于现有的apoll系统,并大幅优化了系统的并发性,可维护性能,组件之间的通讯全部使用异步
通讯,使得更有利于适应现在的互联网的运行环境和开发模式。

1.1系统架构图

appoll框架图_ver5.png

1.2系统架构说明

智付云系统前置接入用ng来做LB处理,利用libev作为socket的异步通讯机制,使用flask web框架来作为微服务架构基础构建。整体架构分为3部分,第一部分为python动态加载框架用来加载C、python或者其他语言编写的模块,第二块是redis-server服务端组件,第三块为流程转发组件。动态组件之间的消息传递由redis服务实现。在一个交易流程中以xml消息总线维持之间的通讯。如需多次交互,由redis服务暂存xml消息总线的内容。

1.3Python动态加载框架

此框架由python语言编写,加载Ctype库,从而实现动态加载C或者其他语言库的能力。在动态库的编写上力求接口同化,都以int funcname(char * resq,char* resp)的方式命名,其中resq为接收的xml消息总线的内容,resp为返回的消息总线的内容及该服务处理后的结果。
Python的动态加载框架所需的配置文件存放在智付云Dhouse/json/和Dhouse/xml里,由*.json,init_op.xml,init_func.xml,user.xml,yl_trans.xml组成,及各用户文件下的trans_next.xml组成。

1.4Redis服务组件

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都 支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排 序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文 件,并且在此基础上实现了master-slave(主从)同步 Redis服务组件主要的作用为:为各个组件的通讯提供了mem层的服务,为多次交互的实现提供缓存xml数据总线的服务。
Redis服务较之于传统的消息队列,管道通讯来说有巨大的优势。首先redis服务是基于key_value存储系统,这个特性在高并发的时候能够有效的提供支持。其次在最新的redis中提供了cluster的能力,为智付云系统提供了组件集群的能力。最后,redis提供了比消息队列,管道丰富多的数据类型及操作,基本上一个redis服务就可以完全满足现有或者将来的组件通讯及缓存、高并发的所有需求。

1.5服务转发组件

本组件由Python语言编写,通过加载json文件夹里的配置文件来驱动交易流程。
Json文件夹里的配置流程,按功能分可以划分为3块(“协议配置”,“交易处理配置”,“错误处理配置”)。由于json的流程组件都是标准的json格式,可以完全展现在web平台,并有web平台管理与生成。
Json配置文件采用多级模板体系,对于重复的交易流程,以及交易模块,可以分不同的粒度来生成对应的模板,以达到管理的方便与配置的重用。

2.组件配置

2.1组件加载

启动时由we_daemon程序加载Dhouse/xml/daemon.xml,由daemon.xml里的配置来启动对应的程序。
Daemon.xml实例:

<srvid>0002</srvid><srvnum>01</srvnum><paramdata>we_control</paramdata><paramindex><num>00</num></paramindex>
<srvid>0003</srvid><srvnum>3</srvnum><paramdata>we_service</paramdata><paramindex><num>01</num><01>we_pyfunc</01></paramindex>
<srvid>0004</srvid><srvnum>3</srvnum><paramdata>we_service</paramdata><paramindex><num>01</num><01>we_dbfunc</01></paramindex>
<srvid>0005</srvid><srvnum>3</srvnum><paramdata>we_service</paramdata><paramindex><num>01</num><01>we_model</01></paramindex>

<srvid>0060</srvid><srvnum>01</srvnum><paramdata>we_web</paramdata><paramindex><num>01</num><01>lot_web00.sock</01></paramindex>
<srvid>0061</srvid><srvnum>01</srvnum><paramdata>we_web</paramdata><paramindex><num>01</num><01>lot_web01.sock</01></paramindex>
<srvid>0062</srvid><srvnum>01</srvnum><paramdata>we_web</paramdata><paramindex><num>01</num><01>lot_web02.sock</01></paramindex>
<srvid>0063</srvid><srvnum>01</srvnum><paramdata>we_web</paramdata><paramindex><num>01</num><01>lot_web03.sock</01></paramindex>
<srvid>0064</srvid><srvnum>01</srvnum><paramdata>we_web</paramdata><paramindex><num>01</num><01>lot_web04.sock</01></paramindex>
Srvid:服务的id号,不重复就可以
Srvnum:启动服务的个数,此例子中启动3个we_pyfunc服务
Paramdata:需要加载的python动态框架,此处为we_service框架
Num:标示需要加载的参数个数
01:参数01的内容为we_pyfunc,就代表此流程需要加载we_pyfunc服务
整个流程为:python mpos_service we_pyfunc

Python动态加载框架启动时,从Dhouse/xml/init_op.xml加载对应的模块,从Dhouse/xml/init_func.xml加载对应的服务。
Init_op.xml实例:

<svrname>we_pyfunc</svrname><libname>we_pyfunc</libname><lib>we_pyfunc</lib><type>py</type>
<svrname>we_dbfunc</svrname><libname>we_dbfunc</libname><lib>we_dbfunc</lib><type>py</type>
<svrname>we_model</svrname><libname>we_model</libname><lib>we_model</lib><type>py</type>

<svrname>we_web</svrname><libname>we_trans</libname><lib>we_trans</lib><type>py</type>
<svrname>we_web</svrname><libname>we_pyfunc</libname><lib>we_pyfunc</lib><type>py</type>
<svrname>we_web</svrname><libname>we_dbfunc</libname><lib>we_dbfunc</lib><type>py</type>
<svrname>we_web</svrname><libname>we_model</libname><lib>we_model</lib><type>py</type>

这里的实例为智付云组件服务需要加载的组件
svrname:服务的名称
Libname:需要加载到框架里服务的名称,此处为we_model服务
Lib:需要加载的服务的文件名,此处为we_model
Type:加载库的类型,此处为py库

init_func.xml实例:

<libname>we_dbfunc</libname><func>merge_model_param</func>
Libname:为需要加载的服务名,此处为we_dbfunc
Func:需要加载的函数名称。此处为merge_model_param

2.2配置文件

配置文件基本都在Dhouse/cfg/下
env.cfg 系统环境变量配置,基本不用更改
redis.cfg redis客户端配置,不用更改
redis_server.cfg redis服务端配置,不用更改
we_lot.ini 系统参数配置文件

[lotdb]
db_type         =       oracle
db_name         =       sea1
db_passwd       =       sea3000
db_userid   =  hebei
db_ip=192.168.176.51
db_port=1521
lotdb:别名标签,这里指的是数据库配置,下面所有配置都在此别名下
db_type:数据库类型
db_name :数据库用户名
db_passwd:数据库密码
db_userid : 数据库库名
db_ip:数据库IP
db_port:数据库端口

系统参数配置

3编程示例

下面以xgboost负荷预测为一个示例流程

3.1交易流程

交易中需要加载的的配置文件有:Dhouse/xml/yl_trans.xml, Dhouse/json/

(1) Dhouse/json/*.json为交易流程处理驱动配置:

首先在webuser.json中增加用户类型

{
    "webuser": 
    [
        {
                "usertype"  : "fhyc",
                "describe"  : "负荷预测接口",
                "next_step" : "web_fhyc/web_menu_fhyc.json"
        },
        {
                "usertype"  : "syn_data",
                "describe"  : "数据同步端口",
                "next_step" : "syn_data/web_menu_syn.json"
        }
    ]
}
Usertype:为用户类型,此处为fhyc
Describe:为描述字段,此处为负荷预测接口
Next_step:为web_fhyc/web_menu_fhyc.json的web菜单模板

(2) 下面为web_menu_fhyc.json的菜单内容:

{
    "web_menu_fhyc": [
        {
            "trans_id": "training_xgboost_normal",
            "menu":
                {
                    "next_step"     : "web_fhyc/training_xgboost_normal.json",
                    "next_step_err" : "web_fhyc/web_err_fhyc.json",
                    "readme":"负荷预测大用户"
                }
        }
}
Trans_id:为本地交易码
Menu:为交易处理流程
Next_step:为本交易流程的模板json
Next_step_err:为本次交易流程错误流程处理模板json
Readme:为交易内容说明

(3) 负荷预测大用户训练流程:

{
    "training_xgboost_normal":[
        {
            "service": "we_trans",
            "command": [
                { "op": "unpack_http_json"}
            ]
        },{
            "service": "we_pyfunc",
            "command": [

                { "op": "set_training_default"}
            ]
        }
    ]
}

service:为服务包
command:为执行函数队列
op:具体操作函数

根本结束后,pack_http_json将报文打包给调用者:

{
            "service": "we_trans",
            "command": [
                { "op": "pack_http_json"}
            ]
        }
    最后整个流程走完,重新打包发给交易终端
    

## 3.2代码示例
智付云系统中python动态加载框架所加载的服务必须是以 funcname(resq,resp)的方式,否则Python框架无法加载函数。
例如:
```python
def set_success(resq,resp):
    public.json_chg_value(resq,"F61","000000")
    public.json_chg_value(resq, "F62", "success")
    return 0

set_success为函数名称
resq:全局json数据总线
resp:局部json数据总线
从交易报文设置F61为成功返回码,设置F62为成功返回消息
请注意,每次调用函数返回的resp,Python动态加载框架都会加入json数据总线中
在we_pyfunc中写好此函数后,需要加入init_func.xml中:
<libname>we_pyfunc</libname><func>set_success</func>

3.3交易组包流程

交易组包的模块在we_pyfunc服务中,其功能完成了http报文的打包与解包,utf-8与GBK的互转。we_pyfunc服务启动时,从Dhouse/cfg_json/http_mapping.json中加载。

{
     "training_xgboost_normal_unpack":
    [
        {"out_code":"startDate",    "sys_code":"FstartDate",       "flag":"T"},
        {"out_code":"endDate",  "sys_code":"FendDate",       "flag":"T"},
        {"out_code":"cimId",    "sys_code":"FcimId",       "flag":"T"},
        {"out_code":"modelTag", "sys_code":"Ftag_U",       "flag":"T"}
    ],
    "training_xgboost_normal_pack":
    [
        {"out_code":"ret_code",     "sys_code":"F61",       "flag":"T"},
        {"out_code":"ret_msg",      "sys_code":"F60",       "flag":"T"}

    ]
}
out_code:外部标签
sys_code:本地标签


training_xgboost_normal_unpack为解包配置,training_xgboost_normal_pack为打包配置
上一篇下一篇

猜你喜欢

热点阅读