数据访问层之资源访问 RAL(百度特有协议支持)

1 RAL 简介

RAL,全称为 Resource Access Layer, 与后端服务进行交互,目前主要是统一下日志格式,方便日志监控

+--------------------------+
|+----------+              |
||+--------+|              |
|||Protocol||              |
||+--------+|              |
||+--------+|              |
|||Balance ||              |
||+--------+|              |
||   ...    |              |
|+----------+              |
+--------------------------+

+--------------------------+
|  配置,关联关系与资源定位|
+--------------------------+

1.1 若没有 RAL 将会怎样?

  • 根据『资源定位服务』查找后端 ip port

  • 后端服务的负载均衡

  • 超时及重试

  • 日志统一

这些可能五花八门,没有一个标准

2 交互协议和数据打包格式

ral 将网络交互过程分成了:

  • 打包

  • 网络传输交互

  • 解包

三个过程。并且支持常用的后端交互协议(http,nshead等)。目前支持 http,nshead

2.1 实现个简单的协议

星络arrow-up-right

2.2 百度 nshead/mcpack

2.2.1 百度 nshead

nshead 与 mcpack 的区别

百度 nshead/mcpack

nshead 协议组成

百度 nshead 使用 36 字节代表 head, 也就是

head

Python 实现方式

format 中解析(共 36 个字节)

  • H : (unsigned shor integer)2 个字节, 0<= number <= 65535

  • I : (unsigned int integer)4 个字节, 'I' format requires 0 <= number <= 4294967295 ,即数字最多 42 亿多

  • 16s: (char[]) 16 个字节

日志打点

2.1.2 mcpack

什么是 mcpack?

mcpack 是一个用于模块间接口数据打包的工具库。

它提供了一系列的函数来帮助你组织接口数据,将它们打包成一个二进制的包,用于网络传输。

使用 mcpack 作为接口,相比传统的二进制接口的好处在于,接口修改时,可以很方便的做到向下兼容。

另外,使用 mcpack 作为接口,还能够提高程序的可配置性和可测试性。

mcpack 是一种内存对象的序列化形式

它能将内存中的数据结构以与计算机架构无关的形式序列化为 bit 流,并由 bit 流重建对象

mcpack 是一种数据交换的协议约定

他使得协议和数据结构能相对独立的变化和演进

实现原理

mcpack 对象模型

基于变量,对象和数组。如: “person”: { “name”:”baidu”, }

简单原理

mcpack的实现原理比较简单,就是把数据按照 key => value 的方式排列起来,在整个 pack 和其中每个数据项的前面加一些必要的头信息,如类型和大小等。

操作原理

数据项的添加均为追加操作,查找则是遍历每个数据项比较 key 是否相等,不支持修改和删除操作。

这样做是考虑实现逻辑简单,且对于绝大多数的接口数据,其效率都是能够接受的。

子 pack 的实现

子 pack 包括:对象 (object) 和数组 (arr). 对象 (object) ,可以认为是一个 pack.

对于子 pack,则是通过 key 的名字前缀来实现。

每个子 pack 会在 pack 中占有一个单独的数据项位置用来保存子 pack 的名字和子 pack 中数据项的个数。

子 pack 中的数据项的名字前会自动加上其所属子 pack 的名字作为前缀,并通过保留字符作为分隔。

对象(object)的分隔符为 MC_PACK_OBJDELIM (','),数组 (array) 的分隔符为 MC_PACK_ARRDELIM (':')。

因此,pack中数据项的名字中不可以出现这2个保留字符。

3 目前功能

3.1 nshead/mcpack

3.2 http

日志监控(统计模块的访问流量和响应时间)

目前日志会统一加上 reqid, 需要手动填写的信息, 手动填写的信息整体前后加上 "[]":

  • 1 file : 调用 file:调用函数名:调用处行号

  • 2 type : 类型

    • shell : shell

    • http : http_GET/http_POSt

  • 3 req_path : 请求路径或命令

    • shell : shell 命令

    • http : http_url

  • 4 req_data : 请求数据

    • shell : None

    • http : '{}'/'{"str_info": "meetbill"}'/'age=21&name=meetbill'

  • 5 cost : 耗时

  • 6 is_success: 是否执行成功

  • 7 err_no : 返回结果码

    • shell : shell 状态码,返回为 0 时表示执行成功

    • http : http 状态码,返回为 200-300 内时表示执行成功

  • 8 err_msg : 异常信息

  • 9 res_len : 返回数据长度

  • 10 res_data : 返回数据

  • 11 res_attr : 返回附加属性,比如 http 返回 header 信息

4 传送门

Last updated