数据采集的背景

用户每天通过不同的终端设备在系统A上做出一系列的操作,比如在新闻系统上的看一些文章,进行收藏或者点赞、评论等等,会触发A系统下不同的微服务,如abc等,如何记录好用户的行为信息,并将其保存下来用于分析用户的行为偏好,需要结合不同的数据采集策略。

业务系统

数据采集的几种方式

方式一:读备份库

为了不影响业务系统的正常运行,可以采用读备份库的数据,这样能够及时获取数据进行一些分析工作,但是有些从业务也会读取备份数据库,还需要考虑一致性和可用性问题。

数据库备份

方式一: 埋点(pingback)

可以在前端APP上记录用户点击,滑动速度,停留时间,进入的时间段,最后看的新闻等等信息,这些可以通过网络传输将埋点信息记录下来,用于数据分析。但是这种方式有可能会对业务系统代码具有一定的侵入性,同时工作量也比较大,存在一定的安全隐患。

埋点

后端采集数据的service

/**

* 埋点接收数据

* @param pingBack

* @return

*/

@RequestMapping(path = "/insert", method = RequestMethod.POST)

@ResponseBody

public ApiResponse insert(@RequestBody PingBack pingBack) {

Boolean result = patientService.savePingBack(pingBack);

return new ApiResponse().success(result);

}

已有的业务系统可以给数据采集系统发送数据

/**

* pingback方式插入

* @param patient

* @return

*/

@RequestMapping(path = "/insert", method = RequestMethod.POST)

@ResponseBody

public ApiResponse insert(@RequestBody Patient patient) {

try{

Boolean result = patientService.savePatient(patient);

return new ApiResponse().success(result);

}catch (InternalError error){

log.error("insert error");

}finally {

pingBackService.jsonRequest(url+"insert", patient);

}

return null;

}

方式三: 发送消息的方式

上述埋点的方式在业务系统繁忙的情况下,会对数据采集系统产生大量的请求,如果数据处理不及时会把数据采集服务打垮,同时为了解耦,这里可以引入消息中间件,如果对时效性要求较高,可以采用推模式对数据采集系统进行推送,如果时效性不是很高,可以采用定时任务拉取数据,再进行分析。

同时可以多个系统订阅消息中间件中不同Topic的数据,可以对数据进行重用,后端多个数据分析系统之间互不影响,减轻了从业务系统采集多份数据的压力。

引入消息中间件

数据采集Service

/**

* 消息中间件的方式更新

* @param patient

* @return

*/

@RequestMapping(path = "/update", method = RequestMethod.POST)

@ResponseBody

public ApiResponse update(@RequestBody Patient patient) {

try{

Boolean result = patientService.updatePatient(patient);

return new ApiResponse().success(result);

}catch (InternalError error){

log.error("update error");

}finally {

sendMessageService.send(patient);

}

return null;

}

中间件发送数据实现(以kafka为例)

@Service

@Slf4j

public class SendMessageService {

@Autowired

private KafkaTemplate kafkaTemplate;

@Value("topic")

private String topic;

private ObjectMapper om = new ObjectMapper();

public boolean send(Object object){

String objectJson = "";

try {

objectJson = new ObjectMapper().writeValueAsString(object);

} catch (Exception e) {

log.error("can't trans the {} object to json string!", object);

return false;

}

try{

String result = kafkaTemplate.send("mysql-kafka-patient", objectJson).get().toString();

if(result!=null){

return true;

}

}catch (Exception e){

return false;

}

return false;

}

}

中间件拉取数据:

@KafkaListener(id = "forward", topics = "mysql-kafka-patient")

public String forward(String data) {

log.info("mysql-kafka-patient "+data);

JSONObject jsonObject1 = JSONObject.parseObject(data);

Message message = (Message) JSONObject.toJavaObject(jsonObject1,Message.class);

messageService.updateMessage(message);

return data;

}

方式四:读取MySQL中的binlog

MySQL会把数据的变更(插入和更新)保存在binlog中,需要在my.ini中配置开启,因此采用kafka订阅binlog,会将DB中需要的字段抓取出来,保存在备份库中,进行数据分析,工作量较小,安全稳定。

name=mysql-b-source-pingBack

connector.class=io.confluent.connect.jdbc.JdbcSourceConnector

tasks.max=1

connection.url=jdbc:mysql://localhost:3306/test?user=root&password=root

# timestamp+incrementing 时间戳自增混合模式

mode=timestamp+incrementing

# 自增字段 id

timestamp.column.name=commenttime

incrementing.column.name=id

# 白名单表 pingBack

table.whitelist=pingBack

# topic前缀 mysql-kafka-

topic.prefix=mysql-kafka-

具体使用可以参考:官方文档

分析对比

数据采集方式

优点

缺点

埋点(pingback)

很细致的将前端用户操作记录下来,能够感知到DB存储之外的用户信息,时效性高

工作量大,可能对业务代码有侵入性;当业务量大的时候,数据抓取服务也需要承载一定的压力,对数据不方便统计和聚合

主库写备库读

及时感知备库中的信息 ,数据一致性强

可能存在大量不需要进行分析的字段,对业务性能有影响

埋点+消息中间件

有效的解决业务量大时对数据存取性能的要求,根据数据抓取服务的需求可以拉也可以推,解耦业务代码

可能会丢失数据,降低了时效性

订阅binlog

工作量小,可以离线感知数据的变化,对数据变更进行统计分析

不能感知除DB数据变更之外的用户行为

因此对数据的抓取可以多种方式结合,具体还是要根据后端数据分析任务对数据的时效性、需求和性能综合考虑。

源码分享

Demo1:患者服务(patient)会产生不同的病例记录,然后doctor服务端采用kafka/pingback/binlog三种不同方式感知患者的患病信息,对数据进行有效的采集。

源码参考

Demo2: 一个数据采集的微服务,用户发送请求到微服务系统中,系统通过日志的形式将请求信息持久化到文件中。

源码参考

mysql采集方式_数据采集的几种方法相关推荐

  1. mysql 创建函数 split_在mysql中实现split函数的几种方法

    在mysql中实现split函数的几种方法 关注:98  答案:2  mip版 解决时间 2021-02-07 11:27 提问者夜落花台 2021-02-07 02:11 在mysql中实现spli ...

  2. 公司MSN被禁用,WEB方式登陆MSN的几种方法

    和众多公司一样,MSN被禁用和屏蔽是很平常的事.可中国人毕竟是蛮聪明的,会查找对策,以下方式是我的整理供大家分享: 在公司WEB方式登陆MSN的几种方法: 1. 登陆http://www.ilovei ...

  3. MES系统读取MySQL数据_MES系统数据采集的四种方式

    MES系统数据采集的四种方式 MES系统的最大特点,就是能实时收集生产过程中的各类信息.数据,然后汇集到数据库中,作数据分析及供管理层查询.如何高效的采集车间的各类数据,是决定一个MES系统软件项目实 ...

  4. win mysql 最大连接_常用的三种修改mysql最大连接数的方法

    MYSQL数据库安装完成后,默认最大连接数是100,一般流量稍微大一点的论坛或网站这个连接数是远远不够的,增加默认MYSQL连接数的方法有两个 方法一:进入MYSQL安装目录 打开MYSQL配置文件 ...

  5. java实现线程三种方式_详解三种java实现多线程的方式

    java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...

  6. qt连接mysql数据库原理_Qt连接数据库的两种方法

    我曾经想过,无论在哪个平台下开发,都不要再接触SQL Server了,但显然不行.我们是来看世界的,不是来改变世界的,想通就好. 前两天,尝试了一下Qt下远程访问数据库.在macOS下,用Qt 5.1 ...

  7. mysql 中split_在mysql中实现split函数的几种方法

    mysql 5.* 的版本现在没有split 函数,以下是几个自定义的split函数,供大家参考. 先设置:SET GLOBAL log_bin_trust_function_creators = 1 ...

  8. linux新增mysql用户_MySQL创建用户的三种方法

    前言:MySQL创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户名 ...

  9. win10可用空间变成未分配_教你两种方法有效利用Win10未分配的空间 - 易我科技...

    Haley 于 2020/08/24更新 磁盘分区管理 摘要 文中介绍了两种方法充分利用Windows10未分配空间,分别为1)格式化Win10未分配空间来创建新的分区,2)在分区上添加未分配空间. ...

最新文章

  1. applicationContext.xml 配置文件的存放位置
  2. 【DND图形库】二、创建控制台窗口和游戏循环
  3. layui 数据表格代码
  4. 字符串,字节,二进制转换
  5. ArcgisPro3.0-3.0.1中文安装包下载及安装教程
  6. Fluent使用(一)
  7. 缓存数据一致性-解决方案
  8. 使用人工智能加快海底数据处理-从粗略过滤到精细智能数据筛选
  9. Jupyter Notebook 更改默认浏览器
  10. 如何回答“你没有经验,我们为什么录用你”
  11. 纯代码告诉你:我的原弈非常(Yanj Future)是怎么下棋的
  12. 一个很棒的字帖生成器
  13. 数据库 第一章 绪论
  14. python中result函数用法_python中函数的参数和返回值
  15. 如何使用智能问答机器人服务
  16. Javascript(BOM)浏览器对象 2017-08-01
  17. 使用Vert.x + SpringBoot编写业务系统
  18. javaweb代码编译打包上架流程简易说明
  19. 【马红“名师+”】送教互研共提升 有效课堂我先行(送教送培第二站)
  20. 多线程 c语言,如何用C语言实现多线程

热门文章

  1. uni-app服务器端搭建
  2. WebRequest 类
  3. 机器学习入门的书单(数据挖掘、模式识别等一样)转
  4. EBS MO_GLOBAL包的分析
  5. python 证书-python requests证书问题解决
  6. 水井硬件集成与仪表仪器采集
  7. pandas筛选数据_2_条件筛选
  8. 如何找到可靠的软件开发公司
  9. html 5 压缩zip,Zip
  10. 2021最新最全前端面试题(包含HTML、CSS、JavaScript、Vue、React、浏览器、算法与数据结构等)