请教一个关于topic订阅的问题

环境信息

  • EMQX 版本:5.0.20
  • 操作系统及版本:
  • 其他: 设备数量40w左右

问题描述

  1. 我们目前有一款设备目前接入到了开源版本的emqx上面,我们需要通过一个特定的客户端来单独接受所有这款设备的所有消息(共享订阅),因为这款设备topic没有任何特殊规律,所以只能一个设备添加4到5个主题,请问emx的同一个客户端对订阅的主题数量有限制吗?如果有的话是多少。 另外订阅主题太多是否对性能有影响?有么有阈值?谢谢!

  2. 另外同一个设备订阅的主题都是aa/$sn, bb/cc/$sn, dd/$sn 这种,那么请问订阅推荐是逐个主题订阅,还是订阅#/$sn, 哪一种方案性能会更好?

  3. 这种情况适用共享订阅吗?增加共享订阅性能与普通订阅的差异大吗?

1)单个客户端订阅主题数没有限制
2) $sn 指的是变量?如果是,可以订阅以下主题 aa/+bb/cc/+dd/+,通过主题前缀即可区分类别处理
3) 适合。共享订阅可能会带来轻微的额外开销,因为需要在 broker 端进行更多的逻辑处理来决定将消息发给哪个客户端,但通常这种开销对整体性能的影响是很小的

是的,但是使用 aa/+bb/cc/+dd/+订阅的话,会订阅其他品类的消息,直接订阅了全量消息,与我们这个品类的需求不符合,所以我们只能一个sn增加6个共享topic,这种方式,一个客户单订阅几万个共享订阅。请问是全量订阅,还是指定sn共享订阅是更好的方案?

  1. 不要用全量订阅,这样你的客户端会受不了的。
  2. 单个客户端订阅主题没有限制个数,但是一般不建议总数不超过 100 个, topic 层集不超过 5 层。
  3. 订阅 A/+ 算一个主题订阅,订阅A/device1 A/device2 算 2 个主题订阅。所以推荐订阅 A/+, 但是你问题 2 中的例子订阅#/$sn 是不行的。你得重新设置一下 topic,把#放在最后,比如:/$sn/#

对于第一点,不要用订阅全量设备(特别是在你已经有 40W 设备的级别)不管你是不是用了共享订阅,这样的方式都不适合。推荐是把消息存在 kafka/rabbitmq之类的中间件中(这个有进程池去存数据),你使用再从中间件消费。

一般不建议总数超过100个,请问下超过100个会有什么问题? 我打算采用+/+/$sn的模式共享订阅单个设备,假如设备有1万个(预计2年),那么就会订阅1万个客户端,这个对emqx性能会有大的影响吗? 特别是在已有40万全量共享订阅的情况下