数据访问层之资源访问 RAL(百度特有协议支持)
1 RAL 简介
RAL,全称为 Resource Access Layer, 与后端服务进行交互,目前主要是统一下日志格式,方便日志监控
+--------------------------+
|+----------+ |
||+--------+| |
|||Protocol|| |
||+--------+| |
||+--------+| |
|||Balance || |
||+--------+| |
|| ... | |
|+----------+ |
+--------------------------+
+--------------------------+
| 配置,关联关系与资源定位|
+--------------------------+
1.1 若没有 RAL 将会怎样?
根据『资源定位服务』查找后端 ip port
后端服务的负载均衡
超时及重试
日志统一
这些可能五花八门,没有一个标准
2 交互协议和数据打包格式
ral 将网络交互过程分成了:
打包
网络传输交互
解包
三个过程。并且支持常用的后端交互协议(http,nshead等)。目前支持 http,nshead
2.1 实现个简单的协议
head(10字节) + body
前 10 个字节表示内容大小,后面表示具体内容
即将数字转为字符串,如果客户端发送 0000000002hi 服务端收到的就是 hi
不过直接将数字转为字符串, 有点浪费
2.2 百度 nshead/mcpack
2.2.1 百度 nshead
nshead 与 mcpack 的区别
百度 nshead/mcpack
nshead 是个传输的协议
是 ns 内部数据交互的协议头,基于 TCP 协议的简单数据交互协议
mcpack 是数据打包格式, 是一个用于模块间接口数据打包的工具库(public/mcpack)。
它提供了一系列的函数来帮助你组织接口数据,将它们打包成一个二进制的包,可用于网络传输
它是一个 key-value 对的实现,具有面向对象的封装,有统一的使用方法,接收方不关心传送的数据格式,只需要根据约定好的 key 获取 value
nshead 协议组成
百度 nshead 使用 36 字节代表 head, 也就是
head(36字节) + body
head
"""Nsheader 协议
+-----------+----------------+------------------------------------------------------+---------------------------------+
| 字段名 | 字段类型 |字段说明 | 字段取值 |
+-----------------------------------------------------------------------------------+---------------------------------+
| id | unsigned short | id | 0 |
+-----------+----------------+----------------------------------------------------------------------------------------+
| version | unsigned short | 版本号 | 0 |
+----------------------------+----------------------------------------------------------------------------------------+
| log_id | unsigned int | (M)由apache产生的logid,贯穿一次请求的所有网络交互 | 任意 |
+-----------+----------------+----------------------------------------------------------------------------------------+
| provider | char[16] | (M)客户端标识,建议命名方式:端_功能,必须少于16字节 | app_index |
+----------------------------+----------------------------------------------------------------------------------------+
| magic_num | unsigned int | (M)特殊标识,标识一个包的起始 | 4218459028 (对应int值-76508268) |
+-----------+---------------------------------------------------------------------------------------------------------+
| reserved | unsigned int | 保留 | 0 |
+----------------------------+----------------------------------------------------------------------------------------+
| body_len | unsigned int | (M)header后请求数据的总长度 | 消息包体长度 |
+-----------+----------------+----------------------------------------------------------------------------------------+
"""
Python 实现方式
import struct
format = "HHI16sIII"
nshead_struct = struct.Struct(format)
# 36
size = nshead_struct.size
nshead_struct.pack(0,0,222,"xxxxx",0xfb709395,0,20)
"""
7个参数为:
id: 0
version: 0
log_id: 222
provider: "xxxxx"
magic_num: 0xfb709395
reserved: 0
body_len: 20
"""
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 个字节
日志打点
talk[436.536] connect[436.535] write[0] read[0]
总耗时 连接耗时 发包耗时 读响应耗时
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
xlib/ral/nshead
xlib/ral/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 传送门
基础
数字转为字节: xlib/auth/jwt/compat.py
Last updated