RunMQTT 托管 MQTT Broker 实测:TLS、QoS、ACL 与延迟
文章
2026年8月19日
4 分钟阅读
UllrAI

RunMQTT 托管 MQTT Broker 实测:TLS、QoS、ACL 与延迟

查看一轮有日期、可复现的 RunMQTT 托管 MQTT 5 实测,覆盖开通、TLS/WSS、QoS、会话、Topic Policy 与受控延迟。

MQTT运维安全实测

本文记录一个一次性 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发布者完成 PUBLISHPUBRECPUBRELPUBCOMP;订阅者收到 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 条/秒
端到端延迟 p50624.92 ms
端到端延迟 p95930.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_AKBAIDU_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中完成一次性合成连通性检查。

比较生产环境方案

先比较生产控制能力与成本模型,再决定运行方式。