实验流量统计设计

news/2025/2/21 7:17:22/

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

目标

  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.ppmy.cn/news/1573821.html

相关文章

Qt中使用QPdfWriter类结合QPainter类绘制并输出PDF文件

一.类的介绍 1.QPdfWriter介绍 Qt中提供了一个直接可以处理PDF的类,这就是QPdfWriter类。 (1)PDF文件生成 支持创建新的PDF文件或覆盖已有文件,通过构造函数直接绑定文件路径或QFile对象; 默认生成矢量图形PDF&#…

【DeepSeek 系列】DeepSeekMoE

文章目录 Transformers 中的 MoETransformer语言模型通用的MoE架构 DeepSeekMoE架构细粒度专家分割共享专家隔离负载均衡考虑 模型预训练不同尺寸模型超参数概览DeepSeekMoE 2B训练数据基础设施超参数 DeepSeekMoE 16B训练数据超参数 DeepSeekMoE 16B 的对齐训练数据超参数 总结…

Unity教程(二十一)技能系统 基础部分

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…

【Linux】序列化、守护进程、应用层协议HTTP、Cookie和Session

⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、序列化和反序列化2、守护进程2.1 什么是进程组?2.2 什么是会话? 3、应用层协议HTTP3.1 HTTP协议3.2 HT…

Mentalab Explore Pro:第三代移动 EEG 设备,开启便携式脑电研究新时代

Mentalab推出的Explore Pro是一款专为研究和工业领域设计的第三代移动脑电图(EEG)设备。它凭借很高的精度和小巧的尺寸,为脑电研究提供了新的可能性。这款设备凭借强大的功能和灵活的设计,成为研究人员在各种实验环境中重要的工具…

人工智能之视频分割模型sam2源码解读

目前只提供了测试的,没训练的代码这一块。 (1)下载源码后按下面几步操作: 也许vs版本低一点也行吧,至此视频已经切成图片了。 (2)预测 它是先把视频分割成图像,然后第一帧先指定要分割的那些东西,然后它就是每帧去处理,最后输出分割后的图像…

新手小白如何挖掘cnvd通用漏洞之存储xss漏洞(利用xss钓鱼)

视频教程和更多福利在我主页简介或专栏里 (不懂都可以来问我 专栏找我哦) 如果对你有帮助你可以来专栏找我,我可以无偿分享给你对你更有帮助的一些经验和资料哦 目录: 一、XSS的三种类型: 二、XSS攻击的危害&#x…

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

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