讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Laper
Laper

剧本策划到成片协作

Seko
Seko

AI短剧一键生成成片

如何在 K6 中实现所有虚拟用户(VU)共享并同步刷新同一认证 Token

风婷姑娘_3932

风婷姑娘_3932

发布时间:2026-02-19 09:08:06

|

309人浏览过

|

来源于php中文网

原创

如何在 K6 中实现所有虚拟用户(VU)共享并同步刷新同一认证 Token

本文介绍在 k6 分布式压测场景下,如何让所有 vu 共享一个全局有效的 jwt/access token,并在过期前统一刷新——通过 redis 实验模块实现跨 vu 状态同步,解决单点 token 管理难题。

本文介绍在 k6 分布式压测场景下,如何让所有 vu 共享一个全局有效的 jwt/access token,并在过期前统一刷新——通过 redis 实验模块实现跨 vu 状态同步,解决单点 token 管理难题。

在 K6 中,每个虚拟用户(VU)运行于独立的 JavaScript 运行时环境中,彼此内存隔离、无法直接共享变量或状态。这意味着 setup() 获取的初始 token 仅对当前 VU 有效;而当 token 需在运行中(如 1 小时后)统一刷新时,传统方式(如重启场景、修改全局变量)均无效——已运行的 VU 不会感知变更,导致鉴权失败或请求混杂多套 token。

✅ 正确解法:借助 Redis 实现跨 VU Token 协调

K6 官方提供的实验性模块 k6/x/redis 是目前最可靠、生产就绪度较高的方案。它允许 VU 通过 Redis 服务读写共享状态,天然支持原子操作与阻塞等待,完美契合“单点刷新、全量同步”的需求。

? 基础配置准备

  1. 启动 Redis 服务(本地或远程均可):
    docker run -d -p 6379:6379 --name k6-redis redis:alpine
  2. 在脚本中启用实验模块(需使用 k6 v0.45+):
    import redis from 'k6/x/redis';

? 推荐架构:双场景协同模式

将负载逻辑与 token 管理职责分离,提升可维护性与稳定性:

场景 VUs 数量 职责
token-manager 1 定期调用 /auth/refresh 接口,获取新 token 并写入 Redis(如每 55 分钟执行一次)
main-test 100+ 每次请求前从 Redis 读取最新 token,自动阻塞等待(避免空值)

? 示例代码(完整可运行)

import { sleep, check } from 'k6';
import http from 'k6/http';
import { SharedArray } from 'k6/data';
import redis from 'k6/x/redis';

// 初始化 Redis 客户端(连接本地 Redis)
const redisClient = redis.connect('redis://localhost:6379');

// Token 缓存键名(建议加前缀防冲突)
const TOKEN_KEY = 'k6:shared:auth_token';

export const options = {
  scenarios: {
    // 【场景1】Token 管理者:单 VU,周期性刷新
    'token-manager': {
      executor: 'constant-vus',
      vus: 1,
      duration: '2h',
      exec: 'refreshToken',
    },
    // 【场景2】主压测:多 VU,并发执行业务请求
    'main-test': {
      executor: 'ramping-vus',
      startVUs: 10,
      stages: [
        { duration: '30s', target: 50 },
        { duration: '2m', target: 100 },
        { duration: '30s', target: 10 },
      ],
      exec: 'makeApiRequest',
    },
  },
};

// ✅ 场景1:刷新 Token(单 VU 执行)
export function refreshToken() {
  // 模拟调用刷新接口(实际需替换为真实 endpoint + refresh_token)
  const res = http.post('https://api.example.com/auth/refresh', JSON.stringify({
    refresh_token: __ENV.REFRESH_TOKEN,
  }), {
    headers: { 'Content-Type': 'application/json' }
  });

  if (res.status === 200) {
    const data = res.json();
    const newToken = data.access_token;

    // 写入 Redis,设置 1 小时过期(与 token 实际有效期对齐)
    redisClient.setex(TOKEN_KEY, 3600, newToken);
    console.log(`✅ Token refreshed and stored in Redis: ${newToken.slice(0, 12)}...`);
  } else {
    console.error(`❌ Token refresh failed: ${res.status} ${res.body}`);
  }
}

// ✅ 场景2:业务请求(所有 VU 执行)
export function makeApiRequest() {
  // 阻塞式读取(若 key 不存在则等待,超时抛错)
  let token;
  try {
    token = redisClient.get(TOKEN_KEY);
    if (!token) throw new Error('Token not available');
  } catch (e) {
    console.warn(`⚠️  Failed to get token from Redis: ${e.message}. Retrying...`);
    sleep(1); // 短暂退避后重试(生产环境建议加指数退避)
    token = redisClient.get(TOKEN_KEY);
  }

  // 发起带认证的请求
  const res = http.get('https://api.example.com/data', {
    headers: { Authorization: `Bearer ${token}` }
  });

  check(res, {
    'status is 200': (r) => r.status === 200,
    'token present': () => !!token,
  });
}

⚠️ 关键注意事项

  • Redis 高可用:生产环境务必部署 Redis 主从或集群,避免单点故障导致全量 VU 请求失败。
  • Token 安全性:不要在日志中打印完整 token(示例中已做 slice 截断),敏感字段建议通过 __ENV 注入而非硬编码。
  • 错误容错:redisClient.get() 在 key 不存在时返回 null,需主动判空并重试;建议封装 getTokenWithRetry() 工具函数。
  • 刷新频率策略:推荐设为 token 过期时间的 80%(如 60min token → 每 48min 刷新),预留网络延迟与处理缓冲。
  • 替代方案对比:
    ❌ 文件系统(open() / writeFileSync)→ 不支持并发写、无跨进程同步;
    ❌ HTTP Server(自建中继)→ 增加运维复杂度、引入额外延迟;
    ✅ Redis → 原子性、低延迟、成熟生态,是 K6 社区事实标准方案。

✅ 总结

K6 的 VU 隔离设计虽保障了压测稳定性,但也要求开发者主动采用外部协调机制来管理共享状态。通过 k6/x/redis 模块构建“单写多读”的 token 管理管道,不仅能精准实现全 VU 一致的认证上下文,还可扩展至共享限流计数器、动态测试数据、灰度开关等高级场景。记住核心原则:状态外置、职责分离、失败可退——这是构建高可靠性分布式压测脚本的基石。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

2173

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

3594

2023.10.07

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

15166

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

1765

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

4237

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

6401

2024.03.01

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn