emqx客户端集群容器化部署的情况下,我该怎么让clientid固定指定不变那
没有太理解问题…
- emqx”客户端““集群”“容器化”部署 是指什么意思呢?
- clientid 是客户端指定的。所以只要代码里自动一个确定的值就可以了
我的意思是client端用同一套代码作为集群的多个节点,那多个节点的clientid就会重复
容器化部署的又不能使用ip+端口去作为clientid
- 可以用环境变量
- 或者使用固定的前缀+随机的生成的后缀
但是需求需要固定 clientid 来保持会话,随机后缀肯定不行,环境变量的话不能保证每个节点 clientid 的唯一性,也会加大部署的复杂度
一般推荐是使用设备 ID 做为 clientid 的,得找一个与设备绑定不变的标识。
设备端 client 是有各自的设备编号作为 clientid ,这个没问题,,,问题是现在服务端 client 是集群多节点部署,这个 clientId 比较难固定,服务端 client 是用来处理设备端上报的消息的
如果需要多个 subcribe 端处理同类 topic 的消息。可以了解一下共享订阅这个功能。
我觉得你没理解我的意思。。
抱歉,误解了。我刚才又仔细看了一次,
是不是多台设备是一个集群,他们每台机器都想上来订阅一个 topic,然后消费消息。
如果还是不对,麻烦能展开说说么?
实在抱歉…
集群内每个节点都订阅了同一个topic,我也知道你们支持共享消息,我这个问题不是消息消费的问题,我想问的是集群内的每一个client的clientid怎么动态指定,因为clentid相同会被会踢下线,而且下线后重新上线要能继续消费消息
我实在是没搞不懂具体说什么的什么意思…
你说不是消费问题,又说下线后重新上线要继续消费消息。前后没什么联系的么。
能不能完整描述一下,
不过一个既定的正确的事实是:只要 clientid 相同绝对会有被挤下线的行为。
这个问题可以解决,你需要的是一个可变范围的值,比如POD所在的顺序,所以可能需要改变你的client部署方式,使用statefuleset部署
假如你的client所在pod是以delpoyment形式部署,这个不好弄
假如你的client所在pod是以statefulset形式部署,那么你的client id可以取的值为: POD-1, POD-2, POD-3,POD-N((N为POD 顺序索引)这样满足了client id在范围内固定,不需要所有的POD都共用一个CLIENT ID,或者随机ID