ADs系列之通用数据解析服务GAS(即将开源)
面对成百上千的生产系统用户操作数据接入落地,你是否厌倦了每次机械编写打包解包的代码?对一次性接入多个数据的时候,还要对不同人联调,费时费力,你是否还会手忙脚乱,忙中不断出错?是否当数据出问题了,用的时候才发现,数据已经损失大半,产品/领导压力巨大,费一天劲才能定位问题,关键是下次还是不能实时发现,快速定位。
怎么办?GAS(通用解析服务)就是为了解决上述问题,结合即通多年数据方案实践,提出的一个数据接入的组件。一杯清茶,轻点鼠标,轻松面对大批数据接入问题。
GAS在ADs中的位置
图 1 ADs整体框架
GAS(General Analyses Service)通用数据解析服务,用协议描述语言(Protocol Description Language – PDL)去描述数据,动态解析数据,实时按规则去除脏数据,实时整理数据,实时告警(需结合网管系统monitor使用)。即可作为分布式,也可作为单机版使用。解析引擎是插件式的,针对不同的协议,只需要开发相应插件即可。
GAS实现原理
GAS的整体框架
图 2 GAS整体框架
GAS master负责数据服务描述文件的管理,所有数据服务描述文件的添加、修改都在GAS master管理。
GAS框架的主要优点:
1) interface主要分发不同数据到不同GAS broker、分发相同数据到不同GAS broker、分发不同协议的数据到运行不同解析插件的broker,分发数据到不同的对外应用,interface只是一个逻辑层。
2)GAS slaves分成不同的broker,每个broker接收不同的数据,或者一个数据可以在不同的broker接收多份,broker之间完全独立。分broker可以分等级运营数据,方便运营,并且不同broker可以运行不同的解析插件,还可以减少路由表的下发包。
3)GAS slaves是去中心化的,GAS master死机只会影响服务描述文件的更新,不会影响已有数据的接收。
4)数据之间是相互独立的,一个数据协议的错误,不会影响到其它数据。
GAS master
图 3 GAS Master框架
1)master机器上的配置模块,负责生成新数据的注册信息,可以登录ads.server.com,填写相关协议描述,就可以自动生成协议描述语言的配置文件。
图 4 服务描述配置页面
2)检查配置文件模块,负责将新的配置读到内存,生成数据解析状态机,以检查是否能正常生成,可以测试协议是否正确。
图 5 协议抓包实时调试页面
3)将正确的数据注册信息更新在测试环境,如果用户确认正确,那么我们可以一键发布到正式环境。
4)slaves每分钟访问一次master,检查是否有新的注册信息,如果有更新,则拉取服务描述文件到本地。
GAS Slave
图 6 GAS Slave框架
slave服务器主要分为两部分:agent进程和数据处理进程,两个模块主要通过共享内存head_mem进行交互,详情如下:
1)agent进程负责每分钟检查一次配置文件是否有更新,如果有更新,则拉取新的服务描述文件到本地磁盘,将更新信息写入共享内存head_mem中,然后修改共享内存中head_mem的版本号。
2)先说明一下,我们每个数据都有一个唯一的标识,我们称为topic_id。每个数据的组包格式必须是Stx+topic_id+stBody+Etx,stBody是用户信息。这样我们收到一个包,就可以判断这个包是那个数据。
服务描述文件大致可分为3部分:基础信息配置,解析字段配置,导入信息配置。基础信息配置中包括日志相关、本地ip、端口、项目负责人等一些全局的配置信息。解析字段配置是收到一个包后,按什么顺序解析、以及按什么格式解析字段。由import_opt_name配置项关联导入信息配置。当在解析过程中,遇到某个字段有import_opt_name配置项时,触发该配置项对应的写共享内存操作。
数据处理主要做以下两个工作:
A)每次接收数据后都检查head_mem中的版本号是否与已知版本号相同,如果版本号不同,则可以判断是那个topic_id的服务描述文件更新了,如果这个topic_id的服务描述文件是新增,那么根据该topic_id服务描述文件生成对应的数据解析状态机。如果是修改,则根据该topic_id配置文件生成对应的数据解析状态机。加载成功,那么释放该topic_id对应的原有数据解析状态机。
B)收到一个数据包,根据topic_id判断调用哪个数据解析状态机,解析生成结构化数据,然后调用COW的接口进行存储。
状态机生成和数据解析实例
一个数据的协议为Stx+topic_id+dwIP+cFlag+wCount+stUin+Etx;stUin=ddwUin+dwID。wCount是stUin的大小,stUin为一个UIN、ID的结构体,假设wCount=2,那么stUin包含ddwUin1、dwID1和ddwUin2、dwID2。解析字段列表为dwIP(short)、cFlag(char)、stUin(数组),stUin后面是导出字段列表dwIP、cFlag、ddwUin、dwID。
Stx、Etx是协议的开始、结束标志,topic_id是协议的唯一标识。
状态机生成过程
图 7 状态机生成过程
状态机生成的过程是:(1)读取服务描述文件,动态生成Config对象,根据服务描述文件中的基础信息配置,填充Config的属性,包括Socket属性。(2)根据服务描述文件中的解析字段配置,动态生成Socket中Field列表IP对象、Flag对象、Count对象、stUin对象;stUin对象依赖Count对象,包含Uin对象、ID对象。(3)根据stUin对象后的import配置,生成stUin对象的Import列表信息。
数据解析过程
数据解析过程与状态机生成过程类似,通过topic_id找到对应的Config对象;然后根据IP对象解析出IP的值,根据Flag对象解析出Flag的值,根据Count对象解析出Count的值为2,根据stUin对象,stUin对象包含Uin对象、ID对象,那么解析出Uin的值、ID的值。stUin对象有import列表,重新组包IP、Flag、Uin、ID的值写出。因为Count为2,再解析出Uin、ID的值,重新组包IP、Flag、Uin、ID的值写出。数据解析状态机是预先生成的,不是动态生成的,这样可以提高数据解析性能。
性能测试
使用部门平均包长度进行测试,测试结果如表1。
表 1 协议解析性能测试
机器类型
cpu 70%解包量
最大解包量
B1老机器(Intel(R) Xeon(R) CPU E5405 @ 2.00GHz cache size: 6144 KB 4核)
8w/s
14w/s
C1新机器(Cpu:Intel(R) Xeon(R) CPU X3440 @ 2.53GHz cache size : 8192 KB 8核)
18w/s
30w/s
展望
从上面介绍,我们还有一些工作需要做:
*protobuf协议插件,已经在测试中。
*txt协议插件,正在开发中。
*增强协议修改前后的兼容性。
ADs系列之通用数据解析服务GAS(即将开源)的更多相关文章
- 网络相关系列之四:数据解析之SAX方式解析XML数据
一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据 ...
- 【Python】 用python实现定时数据解析服务(前言)
一.Why do it? 背景:项目里上传上来的数据都是未解析的数据,而且数据量还算挺庞大的,每天上传的数据有5kw左右,如果用数据库自带的作业来解析的话,数据库会造成严重的阻塞.因此打算把数据读到外 ...
- Babelfish 开源通用代码解析服务
Babelfish 是一个开源的代码解析服务 参考架构 支持的语言 bash go java javascript php ruby c++ typescript 功能 我们可以使用此工具,进行大规模 ...
- 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了
前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...
- C#实现DNS解析服务和智能DNS服务
C#实现DNS解析服务有一个开源项目ARSoft.Tools.Net, ARSoft.Tools.Net是一个非常强大的开源DNS控件库,包含.Net SPF validation, SenderID ...
- GPRS GPRS(General Packet Radio Service)是通用分组无线服务技术的简称,它是GSM移动电话用户可用的一种移动数据业务,属于第二代移动通信中的数据传输技术
GPRS 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . GPRS(General Packet Radio Service)是通用分组无线服务技术的简称,它是GSM移动电话用户可 ...
- C# 串口操作系列(4) -- 协议篇,文本协议数据解析
C# 串口操作系列(4) -- 协议篇,文本协议数据解析 标签: c#uiobjectstringbyte 2010-06-09 01:50 19739人阅读 评论(26) 收藏 举报 分类: 通讯 ...
- android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据
补充:关于PHP服务端可能出现的问题: 如果你刚好也像我一样,用php实现的服务端程序,采用的是apache服务器,那么虚拟主机的配置可能会影响到android应用的调试!! 在android应用中访 ...
- 爬虫系列二(数据清洗--->xpath解析数据)
一 xpath介绍 XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. XPath 使用路径表达式在 XML 文档中进行导航 XPath 包 ...
随机推荐
- ASP.NET MVC掉过的坑_MVC初识及MVC应用程序结构
APS.Net MVC 浅谈[转] 来自MSDN 点击访问 MVC 理论结构 模型-视图-控制器 (MVC) 体系结构模式将应用程序分成三个主要组件:模型.视图和控制器. ASP.NET MVC 框架 ...
- C语言中函数有输出参数
#include "stdio.h"void set(int *ch,int a,int *c,int *d){ c[0]=12; c[1]=133; c[2]=14; ch[0] ...
- VC++编程中获取系统时间
<span style="white-space:pre"> </span>总结了在程序中如何获得系统时间的方法 void CGetSystenTimeDl ...
- java使用ms-dos编译,运行程序
1.安装好JDK,并配置好环境变量. 2.编辑好源程序,如Test.java public class Test{ public static void main(String[] args){ Sy ...
- 【每日scrum】NO.1
今天我们小组正式开始了冲刺,问题还是不少的,有必要记录下来来指导和改进后续的工作: 1.负责去找地图,却发现地图不能很好的适应我们的软件,略心塞>>> 2.本来计划把迪杰斯特拉算法看 ...
- .NET-提取字符串实践总结
前阶段工作时遇到一个截取字符串的问题,由于字符串比较长,大概得几万字符吧(XML形式),要提取中间两个节点之间的内容,在网上费了好大功夫才找到能用的正则.工作当用的时候碰到这样的事最蛋疼了,网上的资源 ...
- Microsoft SQL Server 存储过程举例
-- if SP is existed, drop it. if (object_id('InvHoldToDPS', 'P') is not null) drop proc InvHoldToDPS ...
- OrzFAng系列–树 解题报告
题目描述 方方方种下了三棵树,两年后,第二棵树长出了n个节点,其中1号节点是根节点. 给定一个n个点的树 支持两种操作 方方方进行m次操作,每个操作为: (1)给出两个数i,x,将第i个节点的子树中, ...
- js返回上一页报网页过期问题解决
1.detail详细页面加上返回按钮,返回到list列表页 <input type="button" value=" 返回 " onclick=" ...
- Javascript的怪癖
1.匿名函数在不闭包的情况下this对象为window,而在双匿名闭包的情况下内部匿名函数的this对象为window. 2.在函数中定义变量,在函数外部想使用该变量,如果变量声明时有var,则访问不 ...