本文目录导读:

- 核心原理:动态会话阶段
- 步骤 1:定义多个服务器(Server)
- 步骤 2:配置多协议加载
- 步骤 3:编写混合协议的 Session(关键)
- 步骤 4:编译并运行
- 重要限制与注意事项
- 替代方案:如果你想要“真正的并行”多协议压测
- 总结建议
Tsung 确实支持多协议压测,但它的设计理念是在一个测试会话(session)中混合使用多种协议,而不是同时运行多个独立的单协议压测。
实现方式主要依赖于其 XML 配置文件中的 <session>、<thinktime> 以及 <transaction> 标签,你可以将不同协议的请求(如 HTTP、WebSocket、MQTT 等)按顺序或逻辑组合在同一个虚拟用户的行为里。
以下是具体的实现方法和核心配置要点:
核心原理:动态会话阶段
Tsung 通过 phase 定义压测压力大小,通过 session 定义用户行为,一个 session 内可以嵌套多个使用不同协议的请求。
步骤 1:定义多个服务器(Server)
首先需要在配置文件中定义你要压测的不同服务端点,每个协议对应的服务器地址和端口不同。
<tsung>
<clients>
<client host="localhost" use_controller_vm="true" maxusers="100"/>
</clients>
<!-- 定义多个服务端 -->
<servers>
<!-- HTTP 服务器 -->
<server host="api.example.com" port="443" type="tcp" />
<!-- MQTT 服务器 -->
<server host="mqtt.example.com" port="1883" type="tcp" />
<!-- WebSocket 服务器 -->
<server host="ws.example.com" port="8080" type="tcp" />
</servers>
步骤 2:配置多协议加载
在 <load> 部分,你可以创建多个 phase,每个 phase 可以指定不同的 session,但更常见的是在同一个 session 内按顺序使用不同协议。
<load>
<!-- 第一个阶段:使用 HTTP + MQTT 混合 session -->
<arrivalphase phase="1" duration="5" unit="minute">
<users maxnumber="50" interarrival="2" unit="second"/>
<!-- 这里的 session 名称对应 session 定义 -->
<sessions>
<session name="mixed_http_mqtt" probability="100" type="ts_http"/>
</sessions>
</arrivalphase>
</load>
步骤 3:编写混合协议的 Session(关键)
这是最核心的部分,你需要在一个 <session> 标签内,按顺序或逻辑组合不同的协议请求。
示例:用户先登录(HTTP),再订阅主题(MQTT),然后发送消息(WebSocket)
<session name="mixed_http_mqtt" probability="100" type="ts_http">
<!-- 1. HTTP 协议:用户登录,获取 Token -->
<transaction name="http_login">
<request>
<http url="/api/login" method="POST" version="1.1">
<http_header name="Content-Type" value="application/json"/>
<http_request_body>{"username":"test","password":"123"}</http_request_body>
</http>
<!-- 保存返回的 token 给后续使用 -->
<dyn_variable name="auth_token" jsonpath="$.token"/>
</request>
</transaction>
<!-- 模拟用户思考时间 -->
<thinktime value="2" random="true"/>
<!-- 2. MQTT 协议:订阅主题 -->
<transaction name="mqtt_subscribe">
<request>
<mqtt type="connect" clean_session="true" keep_alive="60"/>
<mqtt type="subscribe" topic="user/%{auth_token}/events" qos="1"/>
</request>
</transaction>
<thinktime value="1"/>
<!-- 3. WebSocket 协议:建立连接并发送数据 -->
<transaction name="ws_send_message">
<request>
<websocket type="connect" url="ws://ws.example.com/chat?token=%{auth_token}"/>
<websocket type="send_message">
{"message": "hello", "channel": "general"}
</websocket>
<websocket type="close"/>
</request>
</transaction>
</session>
步骤 4:编译并运行
Tsung 的配置是静态的,需要在运行前编译好。
# 运行前检查配置 tsung -f my_mixed_protocol.xml status # 开始压测 tsung -f my_mixed_protocol.xml start # 或者使用 -r 指定报告目录 tsung -f my_mixed_protocol.xml -r /tmp/tsung_report start
重要限制与注意事项
- 同一用户,顺序执行:Tsung 不支持真正的“并行”多协议,一个虚拟用户在同一时刻只执行一个协议请求,但可以在一个会话中串行执行不同协议。
- 并非所有协议都原生支持相同:Tsung 对 HTTP、WebSocket 支持最好;对 MQTT、AMQP、JMS 等协议支持较为成熟;但对于 JDBC、LDAP、PostgreSQL 等协议,通常只能在一个 session 内独立使用,不太容易与 HTTP 状态(如 Token)深度交互。
- 变量传递:不同协议之间传递数据(如将 HTTP 返回的 Token 传给 MQTT 或 WebSocket)是可行的,使用
<dyn_variable>提取,然后在后续请求中通过%{变量名}引用。 - 性能开销:一个 session 内塞入大量不同协议的请求,会增加每个用户的执行时间,从而影响能达到的最大并发用户数。
- 不支持 UDP 原生:Tsung 主要基于 TCP,对 UDP 协议的支持有限(DNS 就可以通过 UDP),如果你需要压测 UDP 协议(如 QUIC、Syslog),Tsung 可能不是最佳选择。
替代方案:如果你想要“真正的并行”多协议压测
Tsung 并不适合同时压测多个完全独立的协议流(1000 个 HTTP 用户 + 500 个 MQTT 用户,互不干扰),它的设计是同一个用户的行为流。
如果你需要真正独立、并行的多协议压测,更适合的方案是:
- Locust + 多个 Worker:你可以为每个协议写一个 Python 脚本,然后启动多个 Locust Worker 进程,每个进程负责一种协议,这是目前最灵活的方式。
- Gatling + 自定义组件:通过 Scala 代码可以组合多种协议,但学习成本较高。
- JMeter + 线程组:每个线程组配置一种协议,并行运行,非常直观。
总结建议
| 需求场景 | 推荐方案 |
|---|---|
| 用户单线程顺序操作多种协议 (如:登录 HTTP -> 订阅 MQTT) | ✅ Tsung 完全胜任,且非常优雅 |
| 同时独立压测多种协议(如:1000 个 HTTP 用户 + 200 个 MQTT 用户互不干扰) | ❌ 不推荐 Tsung,更适合 Locust + 多 Worker 或 JMeter 多线程组 |
| 需要复杂交互逻辑(如 if/else、循环、动态参数传递) | ✅ Tsung 支持,但配置稍显繁琐;Locust 的 Python 逻辑更灵活 |
如果你的场景属于第一种(用户行为流),可以直接用上面的 XML 示例配置运行。 如果是第二种(独立并行),建议换用 Locust 或 JMeter。