4、消息中间件选型:Kafka vs RabbitMQ vs Pulsar,在ThingsBoard中的实际应用

消息中间件,说白了就是整个微服务架构的「血管」。

ThingsBoard 里所有设备数据、规则链事件、RPC 指令,全都要靠它来流转。选错了,后面改起来会非常痛苦。我见过不少团队,前期图省事随便选一个,等到日均百万级消息量时,整个系统直接瘫痪。

今天咱们就聊聊 Kafka、RabbitMQ、Pulsar 这三兄弟,在 ThingsBoard 里到底该怎么选。

4.1 为什么 ThingsBoard 离不开消息中间件?

先看一张简化架构图,你就能明白消息队列的位置有多关键:

设备 → 网关 → 消息队列 → 规则引擎 → 数据存储
                    ↓
              微服务A → 微服务B → 微服务C

没有消息队列,所有服务就得直接通信。你想想看,几十个微服务互相调用,耦合度会高到什么程度?

ThingsBoard 里消息队列承担了三个核心职责:

  • 削峰填谷:设备上报数据是突发的,规则引擎处理是平稳的。队列能缓冲这个差异。
  • 解耦服务:Transport 层只管收数据,Rule Engine 只管处理数据,谁也不依赖谁。
  • 保证顺序:同一个设备的数据,必须按时间顺序处理。乱序会导致状态错乱。

核心要点:ThingsBoard 对消息队列的要求,排第一的是「顺序性」,排第二的是「吞吐量」。别搞反了。

4.2 三款中间件的核心差异

我直接给结论,然后咱们再细聊:

特性 Kafka RabbitMQ Pulsar
设计定位 分布式日志流 消息代理 下一代消息平台
吞吐量 极高(百万级/秒) 中等(万级/秒) 极高(百万级/秒)
消息顺序 分区内有序 队列内有序 分区内有序
消息回溯 支持(基于offset) 不支持 支持(基于游标)
运维复杂度 中等
ThingsBoard 支持 原生支持 原生支持 社区插件

4.3 Kafka:ThingsBoard 的默认选择

ThingsBoard 官方默认集成的就是 Kafka。为什么?

我个人习惯用 Kafka 来处理设备数据流。原因很简单:它天生就是为「流式数据」设计的

设备上报数据,本质上就是一个持续不断的日志流。Kafka 的「分区 + 偏移量」机制,完美匹配这个场景。

我的经验:在 ThingsBoard 里,每个设备类型对应一个 Kafka Topic。比如温度传感器用 tb.temperature,湿度传感器用 tb.humidity。这样规则引擎可以根据 Topic 直接分流,不用额外做过滤。

Kafka 在 ThingsBoard 中的典型配置:

# thingsboard.yml 中的 Kafka 配置
transport:
  kafka:
    enabled: true
    bootstrap.servers: "localhost:9092"
    # 每个分区对应一个消费者线程
    partitions: 10
    replication.factor: 3
    # 消息保留7天,方便回溯
    retention.ms: 604800000

嗯,这里要注意:分区数不是越多越好。分区太多会导致 Kafka 的元数据膨胀,反而降低性能。我一般建议分区数 = 消费者线程数 × 2。

4.4 RabbitMQ:适合轻量级场景

RabbitMQ 在 ThingsBoard 里也能用,但场景有限。

我曾经在一个小项目里用过 RabbitMQ。当时设备量只有几百台,每天消息量不到十万条。用 RabbitMQ 完全够用,而且部署简单,一个 docker-compose 就搞定了。

但一旦设备量上来,问题就来了:

  • RabbitMQ 的消息堆积能力弱。内存一满,就开始往磁盘刷,性能断崖式下跌。
  • 消息回溯基本没有。消费过的消息就丢了,想重新处理?没门。
  • 集群扩容麻烦。加节点要重新配置,不像 Kafka 那样平滑。

避坑指南:我曾经见过一个团队,用 RabbitMQ 扛日均 500 万条消息。结果每两周就要手动清理一次堆积,运维苦不堪言。如果你预估设备量会快速增长,直接上 Kafka,别犹豫。

RabbitMQ 在 ThingsBoard 中的配置相对简单:

# RabbitMQ 配置
transport:
  rabbitmq:
    enabled: true
    host: "localhost"
    port: 5672
    virtual-host: "thingsboard"
    # 使用 topic 交换机,支持路由匹配
    exchange: "tb.exchange"

4.5 Pulsar:未来的潜力股

Pulsar 是这三者里最年轻的,但潜力最大。

它把「存储」和「计算」分离了。说白了,Broker 只管转发消息,数据存在 BookKeeper 里。这意味着你可以独立扩容计算层和存储层。

Pulsar 在 ThingsBoard 里的优势:

  • 原生多租户:一个 Pulsar 实例可以服务多个 ThingsBoard 租户,数据完全隔离。
  • 消息 TTL 灵活:可以针对不同 Topic 设置不同的保留策略。
  • 延迟队列:规则链里的「延迟节点」可以直接用 Pulsar 的延迟消息实现,不用额外写代码。

但 Pulsar 也有短板:

  • ThingsBoard 官方没有原生集成,需要自己写插件。
  • 运维复杂度高。BookKeeper、ZooKeeper、Broker 三个组件都要管。
  • 社区资源少,遇到问题不好查。

我的建议:如果你是新项目,团队有运维能力,可以试试 Pulsar。如果是现有 ThingsBoard 集群迁移,老老实实用 Kafka。别为了追新技术给自己挖坑。

4.6 实际选型决策树

说了这么多,到底怎么选?我整理了一个简单的决策逻辑:

  1. 日均消息量 < 10 万:RabbitMQ 够用,部署简单,运维成本低。
  2. 日均消息量 10 万 ~ 1000 万:Kafka 是标准答案。ThingsBoard 官方支持最好。
  3. 日均消息量 > 1000 万:考虑 Pulsar。它的存储计算分离架构,能扛住这个量级。
  4. 需要消息回溯:排除 RabbitMQ。Kafka 和 Pulsar 都支持。
  5. 运维团队 < 2 人:别碰 Pulsar。Kafka 或 RabbitMQ 更稳妥。

你想想看,选消息中间件其实就是在「性能」和「运维成本」之间找平衡。没有银弹,只有最适合你当前场景的方案。

最后说一句:不管选哪个,一定要在测试环境压测。我见过太多人,看文档觉得 Kafka 吞吐量高,结果上线后发现配置不对,性能还不如 RabbitMQ。理论归理论,实践出真知。