3. IoT设备接入层架构
设备接入层是IoT多租户SaaS平台的第一道关口,它决定了平台能接住多少设备、支持多少种通信方式、能否在设备身份上做到租户隔离,以及在断连、重连、突发流量下是否稳定。接入层不是简单的“收数据”,而是一套围绕协议、身份、连接和并发四个维度协同工作的系统。本节从这四个维度展开,并给出可落地的设计思路与示例参数。
多协议适配:把异构设备统一成内部事件
现场设备可能使用MQTT、CoAP、HTTP、Modbus TCP、OPC UA、LwM2M等不同协议。接入层不应让上层业务直接面对这些差异,而应在协议适配层完成“协议解析→统一消息模型→内部事件总线”的转换。以MQTT为例,设备发布到 tenant/{tenantId}/device/{deviceId}/telemetry,适配器解析主题中的租户与设备标识,将payload转换为内部统一结构:
{
"tenantId": "t-1001",
"deviceId": "dev-8f3a",
"ts": 1735689600000,
"metrics": { "temp": 23.6, "hum": 41.2 },
"protocol": "mqtt",
"qos": 1
}
对于CoAP,适配器需处理UDP传输、Confirmable/Non-confirmable消息类型以及Token匹配;对于HTTP,则要处理短连接、请求体解析和鉴权头。适配层的关键设计是“协议插件化”:每种协议实现统一的 ProtocolAdapter 接口,包含 decode()、encode()、authenticate() 三个核心方法。新增协议时只增加插件,不改动连接管理和业务路由。
设备认证:一机一密与租户隔离
设备认证要回答两个问题:这台设备是不是它声称的身份?它属于哪个租户?常见方案有三种:一机一密(每台设备独立密钥)、一型一密(同型号共享密钥,安全性较低)、X.509证书(安全性最高,适合高价值设备)。在SaaS多租户场景下,推荐一机一密或证书方式,并在认证结果中强制绑定 tenantId。
以MQTT接入为例,设备连接时携带 clientId、username、password。接入网关的认证流程为:解析clientId得到设备ID,查询设备注册表获取该设备的密钥或证书指纹,校验签名或密码,最后检查设备状态是否为“已激活”。认证通过后,网关在会话上下文中写入 tenantId 和 deviceId,后续所有消息路由都基于该上下文,避免设备伪造租户标识。
连接管理:会话、心跳与断线重连
连接管理负责维护设备在线状态、会话上下文和消息通道。MQTT的Keep Alive机制要求设备在约定周期内发送PINGREQ,网关在1.5倍Keep Alive时间内未收到任何报文则判定断连。对于海量设备,网关不能为每个连接创建独立线程,而应采用事件驱动模型(如Netty、epoll)配合连接注册表。
连接注册表至少记录:connectionId、deviceId、tenantId、protocol、remoteAddress、lastSeen、sessionState。当设备断线时,网关更新状态并触发离线事件;当设备重连时,若使用持久会话(MQTT Clean Session=false),网关需恢复未确认的QoS 1/2消息。对于CoAP等无连接协议,则通过观察者模式(Observe)维护订阅关系,超时未刷新则移除观察关系。
网关设计:接入网关的分层与横向扩展
接入网关通常分为四层:传输层(TCP/UDP/TLS)、协议层(MQTT/CoAP/HTTP解析)、认证与会话层、路由层(将消息投递到内部消息队列)。网关本身应无状态或弱状态,会话状态可外置到Redis等共享存储,这样网关实例可以横向扩展,前置负载均衡器(如Nginx、HAProxy或云LB)按连接数或CPU进行分发。
一个可参考的部署参数:单台4核8G网关实例,使用Netty处理MQTT连接,在Keep Alive=60s、平均消息速率0.1条/秒/设备的条件下,可稳定维持约5万~8万在线连接。若需要支撑百万级连接,则部署15~20个网关实例,并通过一致性哈希将同一设备的连接尽量落到同一实例,减少会话迁移。实际容量需以压测为准,上述数字仅为示例假设。
海量并发接入:容量估算与压测方法
海量并发接入的核心不是“堆机器”,而是先算清楚单实例容量,再决定扩展方式。容量估算可从三个指标入手:在线连接数、消息吞吐量(条/秒)、单条消息处理延迟。以MQTT为例,假设每台设备每60秒上报一次,消息大小200字节,则10万台设备的消息速率为 100000 / 60 ≈ 1667 条/秒,带宽约 1667 × 200 × 8 ≈ 2.67 Mbps,对网关压力不大;真正的压力来自连接维持和TLS握手。
压测时建议使用emqtt-bench或JMeter MQTT插件,分阶段增加连接数,观察网关的CPU、内存、GC频率和消息延迟。判断容量是否达标的依据:CPU持续低于70%、P99延迟低于200ms、无大量连接被拒绝。若CPU先到瓶颈,可增加网关实例;若消息队列写入成为瓶颈,则调整分区数或批量写入策略。
多租户隔离在接入层的落地
接入层的租户隔离体现在三个位置:认证时校验设备归属租户;连接注册表中以 tenantId 为索引维度;消息路由时按 tenantId 投递到不同队列分区。这样即使某租户设备出现异常流量,也不会挤占其他租户的队列资源。对于共享网关实例的场景,可通过每租户连接数配额和消息速率配额做软隔离,配额值由租户套餐决定,并在网关侧实时统计。
综合来看,接入层架构的落地顺序建议是:先定义统一消息模型和协议插件接口,再实现认证与会话管理,然后接入连接注册表和消息队列,最后通过压测确定容量并配置租户配额。每一步都应以可观测指标(连接数、认证失败率、消息延迟、队列积压)作为验收依据,而不是仅凭功能可用就上线。