数据采集器-架构介绍


title: 数据采集器-架构介绍
date: 2017-01-10 12:40:39
tags: 数据采集器

说点事

说说数据采集的流程

数据采集一般是一个从硬件设备收集到数据,然后对对数据进行解析处理,归类,入库,供查询使用。

说说踩过的坑

  • 坑1:java多线程并发数量以及tcp粘包问题
    由于数据采集是通过tcp进行链接,一个请求成功后需要建立专门的线程进行处理前期用BIO+线程池,发现线程池很容易被吃满,导致cpu与内存被迅速耗尽,后来换成BIO,效果不是很明显;
    在数据发送过程中,数据量过大,时常过短,容易造成tcp粘包,数据过大,在弱网环境下容易造成丢包,此时需要对数据进行分包,拆包处理
  • 坑2:混乱的业务处理逻辑
    指令有很多条,前期工作比较混乱,主线程中各种if else ,没有对业务逻辑进行抽象,正确的使用设计模式,代码耦合度较高,后期代码维护比较困难,只能重构
  • 坑3:响应时间过长导致数据重传
    由于在线程中对数据进行业务查询,响应时间短,造成数据多次重传

埋坑

  • 埋坑1:java多线程并发数量以及tcp粘包问题
    对于线程优化不是那么easy,就选择了netty,选择netty的原因,请参考 http://netty.io/ .在项目中netty做为网络连接层,接收数据后交给专门的handler进行处理
  • 埋坑2:混乱的业务处理逻辑
    先说一下数据处理的流程,
  1. 网络层接收数据
  2. 接收到数据后进行拆包处理
  3. 拆包完成后对数据进行校验
  4. 校验完成后获取指令
  5. 对指令数据集进行处理
  6. 处理完成后返回数据结果
    流程是固定不变的,在有的流程中相当死板,有的则需要灵活处理,这死板的写到一个方法里就好了,而那些灵活多变的则需要进行抽象。
    在这个过程中会用到模版+策略+工厂的设计模式,后面会作为重点内容仔细讲解。
    埋坑3:响应时间过长导致数据重传
    繁重的业务逻辑处理占用了大量的时间,此时可以把数据解析成相应的数据结构里边,放到消息队列中,交给其他机器进行处理,你可能会用放到消息队列里边客户端咋知道数据处理的对不对,我只能这么说,服务器会告诉客户端你传送的数据都是正确的,都成功了,但具体是不是符合业务逻辑,你再来查询一下吧

架构介绍

数据采集器架构图

架构图

名次解释

  • 客户端
    与服务器连接的硬件设备
  • netty
    tcp数据链接框架,主要对保持与客户端的tcp链接并进行数据解包
  • 数据前置处理
    校验数据的合法性,满足基本的协议要求
  • 数据反馈
    对数据进行处理,以满足交互协议
  • 数据处理层
    根据不同的指令代码解析成对应的类
  • 指令码
    每条指令都对应唯一的指令码
  • 解析类
    每条指令最好对应一个解析类,对指令进行专属解析
  • 消息队列
    本项目采用rabbitmq 请参考 http://www.rabbitmq.com/
  • 数据持久化层
    本项目采用mysql
  • 数据后置处理
    对数据采集器采集的数据根据业务逻辑进行相应的处理

步骤介绍

  • 1客户端向服务器发送数据,并接受数据,数据一般是经过16进制编码的数据
    血压数据
    开始码(两位) 指令码(两位) 机器编号 (九位)高压(三位)低压(三位)心率(三位)上传时间(十二位)
    10进制 &123456789140080060201606011002@
    & (开始码)(指令码16进制02,字符无法打印)123456789(机器编号)140(高压) 080(低压) 060(心率) 201606011002 (上传时间) @(结束码)
    16进制 26 02 31 32 33 34 35 36 37 38 39 31 34 30 30 38 30 30 36 30 32 30 31 36 30 36 30 31 31 30 30 32 40
  • 2将netty解包完成的数据交给数据前置处理,对数据进行校验
  • 3将校验通过的数据交给数据处理层,对数据进行处理
  • 4 将数据交给特定的解析类
  • 5 解析类数据解析
    比如将上边的血压数据 解析为 driverNumber=02,code=123456789,up=140,down=80,bp=60,uptime=201606011002 对应的实体类
    如果业务处理时间不复杂,可以在此进行简单的业务逻辑处理
  • 6将转为成json的数据放到消息队列,让消息做异步处理
  • 7异步消息队列将数据交给数据业务逻辑处理类
  • 8处理完成的数据保存到数据库
  • 9向合作方推送数据
  • 10对数据库中的数据进行查询
  • 11将数据交给数据反馈层处理
  • 12处理完成的数据交给netty,供netty返回给客户端

注意:以前写的数据采集太过笼统,最近准备重新编写,如果需要,请加QQ 1217099568,并标注数据采集

git地址 https://github.com/qzshiyongjie/DataCollector
改版本项目配置过于复杂,请看2.0版本
git地址:https://github.com/qzshiyongjie/data-acquisition

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值