4. 流量指标(Traffic):请求速率(RPS/QPS)、数据吞吐量(bps)、并发连接数、设备活跃度统计

在IoT场景中,流量指标直接反映设备与平台之间的通信负载与系统压力。与Web服务不同,IoT流量具有高并发、小数据包、长连接、突发性强的特点。本节聚焦四个核心流量维度:请求速率、数据吞吐量、并发连接数与设备活跃度。

4.1 流量指标定义与IoT场景差异

指标 通用定义 IoT场景特殊含义 典型阈值参考
RPS / QPS 每秒请求数 / 每秒查询数 设备上报、指令下发、OTA轮询、心跳请求 单网关建议 ≤ 5000 RPS
数据吞吐量(bps) 每秒传输的比特数 传感器采样数据、视频流、日志批量上传 NB-IoT 单设备 ≤ 100 kbps
并发连接数 同一时刻保持的连接数量 MQTT/TCP长连接、CoAP短连接、WebSocket 单节点建议 ≤ 10万连接
设备活跃度 统计周期内在线/活跃设备比例 心跳超时判定、离线阈值、日活/月活 日活跃率 ≥ 95% 为健康
关键认知: IoT流量指标必须区分“设备侧”与“平台侧”。设备侧关注上行数据量与功耗;平台侧关注连接密度与请求处理能力。两者采集粒度不同,需分别设计采集点。

4.2 请求速率(RPS/QPS)采集方案

请求速率是衡量系统处理能力的第一指标。在IoT网关或边缘节点,通常使用滑动窗口计数器或令牌桶算法进行实时统计。

4.2.1 采集点设计

  • 设备接入层:MQTT Broker、CoAP Server、HTTP API Gateway
  • 协议适配层:协议转换器、消息解码器
  • 业务处理层:规则引擎、数据清洗管道

4.2.2 采集实现(Go 示例)

// 滑动窗口计数器实现 RPS 采集
type SlidingWindow struct {
    mu       sync.Mutex
    buckets  [60]int64 // 60个1秒桶
    lastTime int64
}

func (sw *SlidingWindow) Increment() {
    sw.mu.Lock()
    defer sw.mu.Unlock()
    now := time.Now().Unix()
    if now != sw.lastTime {
        sw.buckets[now%60] = 0
        sw.lastTime = now
    }
    sw.buckets[now%60]++
}

func (sw *SlidingWindow) GetRPS() int64 {
    sw.mu.Lock()
    defer sw.mu.Unlock()
    var total int64
    now := time.Now().Unix()
    for i := int64(0); i < 60; i++ {
        total += sw.buckets[(now-i)%60]
    }
    return total / 60
}
采集粒度建议: 设备级 RPS 按 1 秒粒度统计;网关级 RPS 按 10 秒聚合;平台级 RPS 按 1 分钟聚合上报。避免高频采集导致性能反噬。

4.3 数据吞吐量(bps)采集方案

数据吞吐量关注的是带宽占用与数据体量。IoT设备通常上报小数据包(几十字节到几KB),但海量设备并发时吞吐量可能达到Gbps级别。

4.3.1 分层采集策略

层级 采集对象 采集方式 存储周期
设备端 单设备上行/下行字节数 固件内嵌计数器 按天轮转
边缘网关 聚合吞吐量(bps) 网卡流量统计 + 协议解析 按小时聚合
云平台 总入口/出口吞吐量 负载均衡器 + 消息队列监控 按分钟实时

4.3.2 吞吐量计算公式

吞吐量(bps) = (总字节数 × 8) / 时间窗口(秒)

示例:某网关1分钟内收到 15000 条消息,平均每条 256 字节
吞吐量 = (15000 × 256 × 8) / 60 = 512,000 bps ≈ 512 kbps
注意: 不要将吞吐量与带宽混淆。吞吐量是实际传输速率,带宽是链路最大容量。当吞吐量持续超过带宽的 70% 时,应触发扩容告警。

4.4 并发连接数采集方案

并发连接数是IoT平台连接密度的直接体现。MQTT长连接场景下,每个设备维持一个TCP连接,连接数直接决定服务器内存与文件描述符消耗。

4.4.1 连接状态模型

IoT 并发连接状态转换模型 INIT(初始) CONNECTING CONNECTED ACTIVE IDLE DISCONNECTED 说明: • 并发连接数 = CONNECTED + ACTIVE + IDLE 状态总和 • 设备活跃度 = ACTIVE / (CONNECTED + ACTIVE + IDLE) × 100%

4.4.2 连接数采集关键点

  • 采集维度:按协议类型(MQTT/CoAP/HTTP)、按设备类型(传感器/网关/摄像头)、按区域(机房/边缘节点)
  • 采集频率:连接数变化较慢,建议 5~10 秒采集一次,避免频繁系统调用
  • 告警阈值:单节点连接数达到最大连接数的 80% 时触发预警告警

4.5 设备活跃度统计方案

设备活跃度是IoT运维的健康度晴雨表。活跃度下降通常意味着网络故障、设备离线、固件异常或电池耗尽。

4.5.1 活跃度计算模型

设备活跃度 = (统计周期内至少上报1次数据的设备数) / (总注册设备数) × 100%

细化指标:
- 日活跃度(DAU):24小时内活跃设备占比
- 时活跃度(HAU):最近1小时内活跃设备占比
- 心跳活跃度:最近一次心跳在超时阈值内的设备占比

4.5.2 活跃度统计流程

设备活跃度统计流程 设备心跳/数据上报 时间戳更新到Redis 滑动窗口判断活跃 聚合计算活跃度百分比 超时未上报 → 标记离线 离线设备移出活跃集合

4.5.3 活跃度统计避坑指南

常见陷阱:
  1. 心跳超时设置过短:NB-IoT设备可能30分钟才上报一次,超时设为5分钟会导致大量误判离线。
  2. 忽略夏令时/时区:活跃度统计应统一使用UTC时间,避免跨时区设备统计偏差。
  3. 活跃度与连接数混淆:设备保持TCP连接但不发送数据,属于“在线但不活跃”,两者需分开统计。

4.6 流量指标采集架构总览

指标 采集源 存储引擎 可视化工具 告警规则
RPS/QPS API Gateway / MQTT Broker Prometheus + VictoriaMetrics Grafana 热力图 突增 200% 持续 5 分钟
吞吐量(bps) 网卡流量 + 应用层统计 InfluxDB / TimescaleDB Grafana 面积图 超过带宽 80%
并发连接数 TCP 连接表 / MQTT 会话 Prometheus Gauge Grafana 仪表盘 达到最大连接数 85%
设备活跃度 心跳表 / 最后上报时间 Redis + ClickHouse Grafana 饼图 + 趋势线 活跃度低于 90%
最佳实践: 流量指标采集应遵循“边缘聚合、云端分析”原则。边缘网关做1秒级实时统计,云端做分钟级聚合与历史分析。避免将所有原始流量上报到中心,造成带宽浪费与存储爆炸。