You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Artillery对NodeJS UDP服务器进行压力测试?

用Artillery测试UDP服务器的解决方案

Artillery本身没有内置UDP测试引擎,你之前用SocketIO引擎的配置完全行不通——因为SocketIO、WebSocket都是基于TCP协议的,和UDP协议不兼容。要测试你的UDP服务器,得用Artillery的自定义脚本引擎,自己实现UDP客户端逻辑来完成负载测试。

步骤1:修改Artillery配置文件

将配置改为使用script引擎,指定自定义脚本路径,同时调整目标参数格式:

config:
  target: "localhost:2222" # 仅作为参数传递给脚本,无需http前缀
  phases:
    - duration: 30
      arrivalRate: 10
      name: 预热测试
    - duration: 30
      arrivalRate: 10
      rampTo: 15
      name: 提升到峰值负载
  processor: "./udp-test-script.js" # 自定义脚本的路径

scenarios:
  - name: UDP消息发送测试
    engine: "script"
    flow:
      - function: "sendUDPMessage" # 调用脚本中定义的测试函数

步骤2:编写自定义UDP测试脚本

创建udp-test-script.js文件,用Node.js的dgram模块实现UDP客户端逻辑,适配Artillery的测试生命周期:

const dgram = require('dgram');

function sendUDPMessage(userContext, events, done) {
  // 从配置中拆分目标地址和端口
  const [host, port] = userContext.config.target.split(':');
  const client = dgram.createSocket('udp4');
  const message = Buffer.from('Hello World');

  // 发送消息到UDP服务器
  client.send(message, parseInt(port), host, (err) => {
    if (err) {
      events.emit('error', err);
      client.close();
      return done();
    }
  });

  // 监听服务器响应
  client.on('message', (msg) => {
    // 上报成功响应事件,Artillery会自动统计指标
    events.emit('response', {
      status: 200,
      body: msg.toString()
    });
    client.close();
    done();
  });

  // 处理超时场景,避免资源泄漏
  setTimeout(() => {
    events.emit('error', new Error('UDP请求超时'));
    client.close();
    done();
  }, 5000); // 5秒超时阈值

  return;
}

module.exports = {
  sendUDPMessage
};

步骤3:启动测试

执行Artillery命令开始负载测试:

artillery run artillery-config.yml

核心说明

  • 自定义函数sendUDPMessage完全遵循Artillery处理器规范:通过userContext获取配置、events上报测试结果、done标记单轮测试结束。
  • 借助events.emit可以向Artillery上报成功响应或错误,工具会自动生成请求数、响应时间、错误率等测试报表。
  • 必须添加超时逻辑,防止客户端因未收到响应一直占用资源。

内容的提问来源于stack exchange,提问作者anileates

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:52:15