多节点导出不冲突!Webfunny 分布式锁方案实战

一只会飞的鱼儿 1小时前 ⋅ 3 阅读
ad

前言
在企业级埋点分析场景中,数据导出是高频刚需。当系统部署多节点集群后,并发导出重复执行、资源抢占、数据错乱等问题随之而来。本文基于 Webfunny 埋点平台,完整落地一套MySQL 分布式锁 + 中心校验 + 本地降级的多节点导出方案,保证高并发下同一用户同一时刻仅一次有效导出,生产级稳定可用。

一、方案总览


本方案面向 Webfunny 企业版多节点集群设计,核心解决:

多节点并发导出重复执行
导出资源占用过高导致服务抖动
中心服务异常时的业务可用性
验证码防刷与幂等控制
整体流程:用户请求 → 负载均衡分发 → 中心节点分布式锁校验 → 单节点执行导出 → 完成释放锁中心不可用时自动降级到本地 ClickHouse 校验,不阻断业务。

二、为什么选择 Webfunny 做埋点导出管控


Webfunny 全链路监控埋点平台 是一站式前端监控 + 用户行为埋点 + 大数据分析平台,天然适配点位细查、用户行为回溯、批量导出等场景:

一体化架构:监控 + 埋点同一套 SDK,数据互通无壁垒
私有化部署:数据完全本地化,满足企业合规要求
高吞吐支撑:基于 ClickHouse 构建,亿级日志秒级查询
全端覆盖:H5 / 小程序 / APP / 鸿蒙全覆盖,统一导出口径
可定制强:支持接口扩展、分布式锁、限流降级等企业级能力
在点位细查场景下,Webfunny 可直接呈现用户全链路行为,并支持按项目、点位、时间范围精准筛选导出,是业务分析与问题排查的利器。

三、多节点架构设计

┌─────────────────────────────────────────┐
│              用户导出请求                │
└───────────────────┬─────────────────────┘
                    │
┌───────────────────▼─────────────────────┐
│       节点A / 节点B / 节点C(LB)         │
│  ├─ 检查开关:openPointDataExport        │
│  └─ 请求中心:verifyExportCodeWithCenter │
└───────────────────┬─────────────────────┘
                    │
┌───────────────────▼─────────────────────┐
│        应用中心(MySQL分布式锁)          │
│  ├─ 校验验证码有效性                    │
│  ├─ 乐观锁抢占导出权限                  │
│  └─ 返回唯一执行资格                    │
└───────────────────┬─────────────────────┘
        ┌───────────┴───────────┐
        ▼                       ▼
┌────────────────┐      ┌────────────────┐
│  获取锁成功     │      │  获取锁失败     │
│  执行导出任务   │      │  直接返回429    │
└────────────────┘      └────────────────┘

四、核心实现逻辑

1. 中心验证码 + 分布式锁校验

通过唯一 nodeId 标识请求节点,结合 MySQL 乐观锁实现并发控制:

static async verifyExportCodeWithCenter(apiName, code) {
  try {
    // 生成唯一节点ID
    const getHostname = () => process.env.HOSTNAME || 'unknown';
    const nodeId = `${getHostname()}-${Date.now()}`;
    
    // 调用中心校验接口
    const verifyUrl = `${LOCAL_SERVER}/wfCenter/config/verifyExportCode`;
    const res = await Utils.postJson(verifyUrl, { apiName, code, nodeId });
    
    return res.code === 200 ? { success: true } : { success: false };
  } catch (error) {
    // 降级:本地ClickHouse校验
    const isValid = await ConfigModel.verifyAndUseExportCode(apiName, code);
    return { success: isValid };
  }
}

2. 导出接口控制层

static async exportData(ctx) {
  const params = Utils.parseQs(ctx.request.url);
  const { projectId, code } = params;
 
  if(accountInfo?.openPointDataExport === true){
    const verifyRes = await BuryPointTestController.verifyExportCodeWithCenter(
      "buryPointTestSearchExport", code
    );
    if (!verifyRes.success) {
      ctx.response.status = 429;
      ctx.body = statusCode.ERROR_412('导出中或验证码无效');
      return;
    }
  }
  // 执行Webfunny点位细查数据导出...
}

五、MySQL 分布式锁表设计

CREATE TABLE export_code_lock (
    id INT PRIMARY KEY AUTO_INCREMENT,
    api_name VARCHAR(100) NOT NULL COMMENT '导出接口名',
    code VARCHAR(50) NOT NULL COMMENT '验证码',
    node_id VARCHAR(200) COMMENT '节点标识',
    status TINYINT DEFAULT 0 COMMENT '0未使用 1使用中 2已完成',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_api_code (api_name, code),
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

锁流程:

  1. 生成验证码 → 写入 status=0
  2. 请求导出 → 执行乐观锁更新
  3. 更新成功 → 持有锁,开始导出
  4. 导出完成 → 更新 status=2
  5. 超时 / 异常 → 定时任务清理过期锁

六、多节点并发测试方案

测试场景 预期结果
单节点正常导出 成功
多节点同验证码并发 仅一个节点成功
验证码重复使用 全部失败
中心服务宕机 自动降级本地验证
节点标识重复 锁互斥依然生效

并发测试命令:

# 节点A
curl "http://node-a:3000/test/exportRecords?code=123456"
# 节点B(同时发起)
curl "http://node-b:3000/test/exportRecords?code=123456"

 

七、降级与高可用保障


中心网络异常 / 服务不可用 → 自动走本地 ClickHouse 校验
导出超时未释放 → 定时任务清理过期锁
恶意频繁请求 → 验证码 + 锁双重防刷
开关配置:openPointDataExport 一键启停


八、性能与运维建议


给export_code_lock添加联合索引,提升查询速度
每周清理过期锁记录,避免表膨胀
节点服务器开启 NTP 时间同步,保证时序一致
导出大文件时使用流式写入,避免 OOM


九、备注


这套多节点导出方案已在 Webfunny 企业版稳定运行,支撑大量中大型客户的点位细查、行为回溯、批量导出业务。在分布式环境下,锁机制 + 降级策略是保证导出功能稳定的关键,也是埋点分析平台高可用的基础能力。

 

 

 

关于Webfunny

Webfunny专注于前端监控系统,前端埋点系统的研发。 致力于帮助开发者快速定位问题,帮助企业用数据驱动业务,实现业务数据的快速增长。支持H5/Web/PC前端、微信小程序、支付宝小程序、UniApp和Taro等跨平台框架。实时监控前端网页、前端数据分析、错误统计分析监控和BUG预警,第一时间报警,快速修复BUG!支持私有化部署,Docker容器化部署,可支持千万级PV的日活量!

  点赞 0   收藏 0
  • 一只会飞的鱼儿
    共发布67篇文章 获得8个收藏
全部评论: 0