实验流量统计设计

news/2025/2/21 5:33:03

当我们需要统计实验中每个分支的实际进入次数时,如何设计一个高效、可靠且对业务影响最小的方案,成为了关键。以下是几种常见的流量统计方案的分析与实现设计

目标

  1. 不影响实际业务使用,不应该因为汇报错误,导致灰度、甚至实际业务受影响
  2. 尽量保证高性能
  3. 能容忍一定误差和延迟

各方案分析

方案一:异步消息队列+定时聚合

每次进入分支发送消息到消息队列,由专门服务处理统计

优点:

  1. 解耦统计和业务逻辑,避免了统计逻辑的复杂性直接影响到主业务流程。
  2. 可靠性优,不容易丢数据

缺点:

  1. 需要维护消息队列,复杂性高
  2. 资源消耗较大
  3. 实时性差

方案二:本地计数器+定时上报

通过本地内存维护计数器,然后定期上报到关系数据库

优点:

  1. 实现简单
  2. 维护成本低

缺点:

  1. 关系数据库存在性能瓶颈

方案三:分布式计数器

使用redis直接维护计数器

优点:

  1. 实时性好
  2. 实现较为简单
  3. 支持水平拓展

缺点:

  1. 频繁计数,网络开销较大
  2. 在Redis宕机的情况下,可能会丢失数据或导致计数不准确

方案四:多级缓存

本地缓存作为一级缓存,在到达阈值时或时间周期后,汇报给redis。并通过额外服务定期更新到关系数据库

优点:

  1. 性能与可靠性均衡
  2. 系统容错性高

缺点:

  1. 实现较为复杂
  2. 实时性一般

方案五:日志采集

当进入分支时,利用现有的日志系统打印日志,再通过额外服务采集日志进行统计

优点:

  1. 对业务零影响,不需要引入额外组件
  2. 高性能,尤其是在大规模系统中,日志系统可以提供高效的数据采集和处理能力
  3. 可拓展性

缺点:

  1. 实时性差
  2. 精准度差,可能存在日志丢失或采集延迟的问题
  3. 日志处理麻烦

我的选择

综合来看,多级缓存方案是最适合我当前应用场景的选择。它在性能、可靠性、系统容错性方面取得了较好的平衡,适合在高并发和实时性要求较高的环境中使用。

具体实现

本方案主要引入配置管理器、本地统计器、数据同步器、指标管理器结构

主要职责如下

  • 配置管理器:从远程数据库拉取需要汇报的测试实验配置
  • 本地统计器:测试实验计数统计
  • 数据同步器:同步本地数据到redis
  • 指标管理器:协调各组件

本地统计器

主要功能如下

  • 更新需要进行统计的实验
  • 找到对应实验的相应分支,并递增其访问数量
  • 在达到阈值或超时需要进行上报

场景特性分析

  • 单项目实验数量有限
  • 实验流量可能会非常巨大,产生高并发
  • 必须保证基本业务不受影响
  • 由于监控实验会发生变化,因此要考虑变化时对统计的影响

需要解决的问题

  • 全量还是增量?

    全量的优势在于直接覆盖,不需要额外的重置增加操作。但问题在于一旦项目发生了重新启动就会被重置,并且由于单项目可能运行了多个实例,因此增量会更好些

  • 本地统计器主动汇报,还是管理器进行拉取?

    超阈值本地统计器通知管理器,管理器到达一定时间或接受到本地统计器通知,进行拉取

  • 在采用增量方案情况下,具体该如何做呢?

    本地统计器记录最新全量a,管理器记录最新同步全量b,每次同步时递增 a − b a-b ab,并在同步成功后,更新管理器最新同步全量为a

方案

监控实验map+实验分支统计map

进入分支时,先判断该实验是否被监控,若是,则找到该实验对应分支进行递增

性能优化点

  • 可对监控实验map进行直接替换,而不是增删,以减少并发冲突
  • 可一次将本项目所有实验加入实验分支统计map中,以防止在运行中增加之后对该结构进行变更

配置管理器

配置管理器定期检测本项目实验中是否有统计监控变化,在变化之后同步到指标管理器

  1. 指标管理器传递项目实验初始化配置管理器
  2. 配置管理器定期拉取,并检查配置是否变化
  3. 若变化,则将变化后的配置传递给指标管理器

数据同步器

根据指标管理器传递过来的递增数据发送到redis中,在当前设计中主要用于批量更新多个值

其实同步器并非必要,完全可以内嵌能力到指标管理器,但作为一个单一职责划分以及考虑未来可能不仅仅只会如此简单,因此也还能接受

redis可设计为key为实验+分支,value为次数

指标管理器

交互流程如下

  1. 启动指标管理器
    1. 异步运行配置管理器
    2. 异步运行本地统计器
    3. 异步运行数据同步器
  2. 配置管理器从远端拉取配置,并通过指标管理器同步到本地统计器
  3. 本地统计器根据配置初始化结构
  4. 进入测试分支后,本地统计器判断是否处于被监控实验,并在实验分支统计map中递增数值。若超出次数阈值后,通过管道通知指标管理器
  5. 指标管理器到达一定时间周期,或接收到本地统计器通知后,遍历所有监控实验分支统计值,并与记录的最新同步统计值计算差值,推送到同步器中
  6. 同步器推送到redis,成功后反馈指标管理器,指标管理器更新最新同步统计值
  7. 若配置发生变化,指标管理器直接替换本地统计器中监控实验map

http://www.niftyadmin.cn/n/5860228.html

相关文章

界面控件DevExpress WPF v24.2新版亮点:支持.NET 9

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF控件近…

Django 5实用指南(五)模板系统

Django5的模板系统是其核心功能之一,允许开发者将动态数据嵌入到HTML模板中,并根据不同的业务需求渲染页面。Django模板系统基于 Django模板语言(DTL),它提供了一些强大的功能,如模板标签、过滤器、条件语句…

解决videojs在ios端视频无法播放的问题

解决videojs在ios端视频无法播放的问题 问题描述:问题原因116为本地环境,为无缓存37为测试服务器 解决方法 问题描述: 在做多端嵌入的H5页面时,通过videojs插件做视频的播放,发现在web网页,andriod的app端…

MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 2

第02章_MySQL的数据目录 1. MySQL8的主要目录结构 1.1 数据库文件的存放路径 MySQL数据库文件的存放路径:/var/lib/mysql/ MySQL服务器程序在启动时会到文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件…

使用 FFmpeg 剪辑视频指南

FFmpeg 是一个功能强大的多媒体处理工具,可以进行视频和音频的剪辑、合并、转码等操作。本文将详细介绍如何使用 FFmpeg 进行视频剪辑,并通过实例帮助你快速掌握剪辑技巧。我们会从最基础的剪切功能讲起,再延伸到一些高级操作,如指…

Spring Boot 常用注解详解

文章目录 Spring Boot 常用注解详解1. Spring Boot 核心注解1.1 SpringBootApplication1.2 Configuration1.3 ComponentScan 2. Bean 相关注解2.1 Bean2.2 Component2.3 Service2.4 Repository2.5 Controller 和 RestController 3. 依赖注入注解3.1 Autowired3.2 Qualifier3.3 …

基于 Flask 与 MySQL 构建简单的博客系统

引言 在互联网时代,博客是人们分享知识、记录生活的重要平台。借助 Python 的 Flask 框架与 MySQL 数据库,我们可以快速搭建一个简单的博客系统。本文将详细介绍如何从零开始构建这样一个系统,涵盖环境搭建、数据库设计、后端接口实现以及前端…

.NET8入门:13.ASP.NET Core MVC

ASP.NET Core MVC是一种十分经典的软件设计模式架构,接下来我们来了解一下MVC在ASP.NET8中的一些基础概念。 MVC架构 MVC架构主要包含以下三层: M(Model):模型层,其职责为UI显示以及业务逻辑或操作所需要…