埋点服务设计与开发(一)调研阶段

1,概述

操作日志分析服务(OperationLogAnalysis)主要功能是:

  • 记录用户操作日志;
  • 对用户操作日志进行分析并保存到持久化数据库;
  • 将分析结果输出,为产品的设计与优化提供数据支撑;

功能描述:

  • 用户操作日志:鼠标点击、文件上传耗时、请求成功与失败等

  • 分析结果:各个按钮点击频次、当前用户在线人数、用户活跃时长等

两个业务:

  • 日志收集(LogCollector)
  • 日志处理(LogProcessing)

2,设计

2.1,系统架构

image-20220525205618890

图示中,黄色模块为客户端、红色模块为业务服务端、黄色模块为基础设施服务

2.2,关键节点

客户端

这里的客户端可以是web、IOS、Android或者其他各种形式的client

在进行操作日志记录上报时,先检查是否存在活跃状态连接

  1. 如果没有,就直接请求创建,创建时需要带上消息里面带上token值进行连接校验
  2. 如果已经存在,就直接发送记录数据(使用Google ProtoBuf序列化二进制流)即可

负载均衡器

因为操作日志记录是一个很高频的过程,每一个当前活跃账户都需要建立长连接,每一个操作事件都需要进行记录上报,所以【长连接服务】需要进行集群部署满足大量连接、大量数据传输的高性能、高可用要求。因而引出了,需要一个负载均衡器来平衡各个节点的消息处理情况。

日志采集

主要用于操作日志记录数据的透传转发,将前端传输过来的序列化数据直接转发push给kafka消息队列。

消息队列

本项目中用于流量削峰,接受多个【长连接服务】的数据推送push,并等待【流处理服务】进行消费pull。

流处理

操作日志记录是一种无边界、实时产生的数据流,其数据特性比较适合使用Flink流引擎处理。

结果输出

数据处理的结果怎么输出?

  1. 直接对接前端编写前端 UI 交互页面
  2. 直接以生成文档然后下载的形式获取
  3. 其他成熟的数据可视化工具

3,实现细节

3.1,负载均衡器

直接使用istio中的ingress-gateway进行负载均衡,便于集群管理。

3.2,日志采集

首先尝试使用C语言中的NIO或者AIO框架实现,之后在考虑使用Golong或者Rust语言实现,

最后将Java实现作为保底(因为使用Java+Netty实现过相似的功能)。

难点:

  1. 传输数据格式、规范定义;

  2. 长连接主动关闭策略;

  3. 在客户端创建长连接请求时,进行连接许可校验(token校验);

    • 校验成功后,才能允许正常连接;
    • 否则,直接拒绝。

3.3,流处理

使用Flink流处理框架+dolphinDB时序数据库

难点:

  1. 如何实现无状态?如果单节点就直接进行数据分析即可,但是多节点进行MQ轮询消费,那么如何解决节点的数据统一?
    • 直接使用Flink的多节点功能
    • 使用中心redis缓存进行状态存储?将状态由节点转移至redis缓存,从而变成无状态
  2. 分析的结果需要什么样的?
    • 点击频次、日活、月活、事件
  3. 结果输出形式
    • 直接提供接口查询目标数据结构
    • 直接使用管理工具显示相关数据
    • 开发专门的数据显示页面
  4. 数据处理是否需要严格按照时序排列?
    • 严格要求:①kafka保证消息顺序;②多节点的日志采集,大概率也会有消息顺序紊乱问题;
    • 非严格要求(倾向这个):①只要在分钟时间级别是有序即可,因为数据处理的时序紊乱没有特别大影响;②一整个操作事件流程,进行持续收集然后封装成一个消息包发送

4,其他

4.1,整体实现

部署:k8s、istio、helm部署

中间件:Quarkus云原生配置中心、dolphinDB时序数据库、redis缓存、kafka消息中间件、ingress-gateway(istio集成)

业务服务:LogCollector日志收集服务、LogProcessing日志处理服务

产出成果物:

  1. LogCollector日志收集、LogProcessing日志处理两个服务的docker镜像文件;
  2. helm整体的系统部署文件 OperationLogAnalysis.yaml (包含所有中间件、服务的部署配置,可平行迁移、扩缩容);
  3. 设计文档、自测票、使用文档;

4.2,持久化数据库选型

由于操作日志记录的数据量与高并发,因此使用MySQL、postgres等常见的数据库会有性能瓶颈(插入与查询),所以需要选用一款与需求相匹配的数据库。

首先分析一下我们的数据特点:

  1. 数据插入频次很高、数据修改基本没有、数据读取频次相对较少 ——>必须拥有高性能的插入特性
  2. 因为用户操作是一个有时间先后的过程 ——> 必须擅长处理时序数据
  3. 后续可能需要该数据库的性能扩展 ——> 最好支撑集群部署、动态扩缩容、容灾
  4. 为了方便数据管理、读取 ——> 最好有成熟的数据管理、可视化工具或者插件
  5. 基于经济的考量 ——> 最好是开源免费的,或者有免费的社区版
  6. 为了方便后续其他同事进行维护 ——> 最好是社区活跃度较高、使用流行度高

综合一下就是:插入性能、时序处理能力;集群、成熟工具、开源程度、流行度

数据库选型对比

数据库 描述 优点 缺点
MongoDB 文档数据库 1,schema-less
2,扩展分片集群方便
3,网络文档相对较多
1,4.4版本前不支持事务
Cassandra 分布式数据库 1,集群扩展方便
2,去中心化(P2P、Gossip)
3,可调复制一致性级别
4,提供了类似于SQL语言的CQL查询语言
1,数据冗余度高
influxDB 时序数据库 1,高并发读写
2,拥有适配的管理、可视化工具
3,当前时序数据库流行度第一
1,集群功能收费
Kdb+ 时序数据库 1,处理速度相对较快
2,当前时序数据库流行度第二
1,32位免费版,有内置的性能限制
dolphinDB 时序数据库 1,开发快、处理速度相对较快、部署快和学习快
2,当前时序数据库流行度排名增长最快
3,支持集群部署
4,有专门的可视化管理样例
5,文档社区活跃
1,不开源,但是放开了社区版20年证书
集群2节点,每个节点限制2C8G
Prometheus 时序数据库 1,k8s默认的监控与时序数据库
2,开源、云原生基金会项目
3,相对其他时序数据库较为成熟
1,专门针对监控数据进行定制
timescaleDB 时序数据库 1,基于PostgreSQL数据库打造
2,完全开源
1,本质上是一个 PostgreSQL 的插件,
数据库底层决定了其读强写弱的缺点
2,不支持水平扩展(集群)
ElasticSearch 搜索引擎 1,擅长文本搜索
1,插入性能一般
GaussDB 关系型数据库 1,人工智能技术融入数据库调整
2,异构计算框架
3,源于PostgreSQL9.2
Snowflake 关系型数据库 1,存算分离 1,不开源,收费!

当前综合比对各个NoSQL数据库的优缺点后,相对而言更加倾向于使用dolphinDB数据库,原因:

1,开发快、处理速度相较于其他时序数据库更快、部署快和学习快

2,当前时序数据库流行度排名增长最快

3,支持集群部署、扩缩容、容灾

4,有专门的可视化工具,并且工具中有多种数据处理函数与可视化策略,同样也可以集成Grafana可视化工具

5,文档社区活跃、更新迭代持续进行中、使用样例demo多

6,虽然该数据库不开源,免费版限定了集群、核心、内存的个数,但是这些在前期不需要担心

5,参考链接

  1. 什么是Flink?Flink能用来做什么?
    • 介绍了批处理、流处理的区别与特性
    • 介绍了Flink的特性与功能
  2. 什么场景应该用 MongoDB ?
  3. 哪些场景下使用MongoDB
  4. 使用 Kafka + Spark Streaming + Cassandra 构建数据实时处理引擎
  5. 什么是InfluxDB?跟其他数据库比有哪些优势?
  6. influxDB 适合做什么?
  7. 时序数据库timescaledb
  8. 深入理解什么是 Log Structured-Merge Tree
  9. DolphinDB高可用集群部署教程
  10. 时序数据库DolphinDB和TimescaleDB 性能对比测试报告
  11. 新一代大数据引擎Flink厉害在哪
  12. Apache Flink官网
  13. 基于 K8S 的 DolphinDB 部署教程
  14. DolphinDB GUI
  15. Prometheus - 时间序列数据库

posted on 2022-05-25 21:04  周健康  阅读(214)  评论(0编辑  收藏  举报

导航