本文记录一个一次性 RunMQTT 托管 MQTT 5 Broker 在受控合成测试中的真实行为。方法、聚合输出和限制全部公开,便于复核,而不是依赖无法验证的性能宣传。
测试没有使用客户数据。脚本生成唯一的设备身份、Topic 和 Payload,不在输出中打印这些内容,并在结束时删除 Broker 及相关 Provider 资源。
测试环境
| 字段 | 值 |
|---|---|
| 执行时间 | 2026-08-19 12:46:45 UTC |
| Broker | 一次性 RunMQTT 托管 MQTT 5 Provider Core |
| Broker 地域 | 全球托管端点;未选择生产套餐规格 |
| 客户端地域 | us-west |
| 运行时 | Node.js 22.23.2 |
| MQTT 客户端 | MQTT.js 5.15.2 |
| 协议 | MQTT 5 |
| 数据 | 仅使用生成的 Topic 与合成 Payload |
| 清理结果 | Provider 查询确认所有本次创建的资源均已删除 |
开通耗时从提交 Provider Core 创建请求开始计算,到第一次 MQTT over TLS 连接成功为止。连接耗时分别记录 TLS 与 WSS 各 5 次新连接。受控消息样本在同一客户端地域使用一个发布者、一个订阅者、QoS 1、200 条生成消息,以及每批 20 个并发发布。
实测结果
开通与安全连接
- 提交创建到第一次 TLS 连接:8,062.68 ms。
- MQTT over TLS:5/5 成功,最短 630.19 ms,p50 644.21 ms,p95 与最大值均为 649.91 ms。
- MQTT over secure WebSocket:5/5 成功,最短 1,072.63 ms,p50 1,128.83 ms,p95 与最大值均为 1,598.39 ms。
这些是本轮测试中客户端观测到的连接耗时,不代表长期可用率或服务等级目标。
QoS 与会话行为
| 场景 | 观测结果 |
|---|---|
| QoS 0 | 发布者发送 PUBLISH;订阅者以 QoS 0 收到消息 |
| QoS 1 | 发布者发送 PUBLISH 并收到 PUBACK;订阅者以 QoS 1 收到消息 |
| QoS 2 | 发布者完成 PUBLISH → PUBREC → PUBREL → PUBCOMP;订阅者收到 QoS 2 |
| 持久会话 | 重连返回 sessionPresent=true;一条排队的 QoS 1 消息在恢复后送达 |
| Last Will | 观测到 QoS 1 的遗嘱消息 |
| Retained | 新订阅者收到此前存储的 Payload,但该报文的 retain 标志为 false |
Retained Payload 确实发生了回放,但 retain 标志为 false 并不符合预期。因此,本轮结果不宣称完整的 Retained Message 兼容性;依赖该标志的应用应使用实际客户端和 Broker 配置重复测试。
Topic Policy 允许与拒绝
测试用两个生成的 Policy Template 区分完整权限观察者与受限客户端。受限策略只允许一个生成的 allowed/# 子树。
- 两个客户端都成功连接。
- 观察者订阅得到确认。
- 受限客户端的允许订阅得到授权。
- 允许发布得到确认并成功送达。
- 拒绝范围内的 QoS 1 发布在有界观察时间内没有收到确认,也没有送达观察者。
- 拒绝范围内的订阅返回拒绝信号。
未送达的发布与被拒绝的订阅证明了本轮测试使用的允许/拒绝边界。no_acknowledgement 只描述拒绝发布的真实观测,不会被改写成未实际收到的 MQTT Reason Code。
受控 QoS 1 消息样本
| 指标 | 结果 |
|---|---|
| 发布消息 | 200 |
| 送达消息 | 200 |
| 错误 | 0 |
| 并发数 | 20 |
| 总耗时 | 3,393.39 ms |
| 观测吞吐 | 58.94 条/秒 |
| 端到端延迟 p50 | 624.92 ms |
| 端到端延迟 p95 | 930.89 ms |
| 端到端最大延迟 | 1,075.86 ms |
延迟由同一个 Node.js 进程从每次发布前开始计时,到订阅者收到消息为止,其中包括客户端调度、网络传输、Broker 处理和批次影响。这不是仅测量 Broker 内部处理的延迟。
脱敏聚合输出
下面是完整成功运行输出的聚合 JSON。脚本不会打印凭据、Provider Core ID、设备名、Topic 或 Payload。
{
"schemaVersion": 1,
"environment": {
"broker": "RunMQTT managed MQTT 5 broker",
"brokerRegion": "global",
"clientRegion": "us-west",
"client": "MQTT.js 5.15.2",
"node": "v22.23.2",
"protocolVersion": 5,
"executedAt": "2026-08-19T12:46:45.768Z"
},
"provisioning": { "submittedToFirstTlsConnectionMs": 8062.68 },
"connections": {
"tls": {
"attempts": 5,
"successRate": 1,
"minMs": 630.19,
"p50Ms": 644.21,
"p95Ms": 649.91,
"maxMs": 649.91
},
"wss": {
"attempts": 5,
"successRate": 1,
"minMs": 1072.63,
"p50Ms": 1128.83,
"p95Ms": 1598.39,
"maxMs": 1598.39
}
},
"qos": [
{ "qos": 0, "publisherExchange": ["send:PUBLISH"], "subscriberQos": 0 },
{
"qos": 1,
"publisherExchange": ["send:PUBLISH", "receive:PUBACK"],
"subscriberQos": 1
},
{
"qos": 2,
"publisherExchange": [
"send:PUBLISH",
"receive:PUBREC",
"send:PUBREL",
"receive:PUBCOMP"
],
"subscriberQos": 2
}
],
"persistentSession": { "sessionPresent": true, "queuedMessagesDelivered": 1 },
"retainedMessage": { "observed": true, "retainFlag": false },
"lastWill": { "observed": true, "qos": 1 },
"acl": {
"connectionsObserved": true,
"observerSubscribeOutcome": "acknowledged",
"allowedSubscribeOutcome": "granted",
"allowedPublishOutcome": "acknowledged",
"allowedPublishDelivered": true,
"deniedPublishOutcome": "no_acknowledgement",
"deniedPublishDelivered": false,
"deniedSubscribeOutcome": "rejected"
},
"controlledPerformance": {
"messages": 200,
"qos": 1,
"concurrency": 20,
"delivered": 200,
"errors": 0,
"elapsedMs": 3393.39,
"throughputMessagesPerSecond": 58.94,
"latencyMs": { "p50": 624.92, "p95": 930.89, "max": 1075.86 }
},
"cleanup": { "removed": true }
}
复现测试
先查看公开的 Managed Profile和实验说明。在隔离环境中通过 Secret Manager 注入 BAIDU_IOT_AK 与 BAIDU_IOT_SK 后执行:
MANAGED_LAB_CONFIRM=run-once \
MANAGED_LAB_CLIENT_REGION=us-west \
pnpm mqtt:managed-lab
确认变量是刻意设置的安全门槛:该命令会创建可能计费的 Provider 资源。每轮会创建唯一 Core、两个 Policy Template 和生成的设备。finally 路径会删除设备、Policy、Template 和 Core,再确认 Core 已不存在。任何 cleanup.removed=false 都应被视为需要立即清理的失败运行。
限制与适用范围
- 这是一轮有日期的合成测试,不是长期可用性研究。
- 结果只适用于列出的客户端、运行时、地域、Provider 行为与配置。
- 本轮没有选择生产容量套餐,因此不能推导任何套餐容量上限。
- 200 条消息样本刻意控制在较小范围内,不是压力测试、SLA 或容量保证。
- 没有使用客户 Payload、客户 Topic、生产设备身份或真实业务负载。
- 这些私有托管 Broker 指标没有使用共享的公共 MQTT Broker。
- Retained Payload 已回放,但报文标志仍需进一步兼容性验证。
可以用这份证据复现 QoS 与重连行为、验证最小权限 Topic Policy,或比较托管与自建 MQTT 的运维工作。随后查看 RunMQTT 功能、比较托管 Broker 价格,也可以在仅供测试的公共 Broker中完成一次性合成连通性检查。
