1)emqttd 使用 SSL遇到的问题:服务器直接布了一份emqttd
,然后什么都没管,端口默认的ws 8083,wss8084,mqtt 1883,mqtt(ssl) 8883。
结果跑起来之后点了点发现出了问题,前端的websocket根本连不上,Chrome报错
WebSocket connection to 'wss://10.0.0.111:8084/mqtt' failed: Error in connection establishment: net::ERR_INSECURE_RESPONSE
mqtt配置文件中描述如下:
但是发现即使按照这个路径配置好了还是不行,google上有解答方案:
问题原因在于证书只对域名有效,而不是IP。改成域名一测,立马成功
还有一个小提示,在windows环境下安装的emqttd,他的config文件不要用记事本打开,如果用记事本打开进行修改的话,运行emqttd console会报错,但是用写字板打开没问题,感觉是编码的原因
一个客户端sub很多主题和数据,出现宕机?使用本地共享订阅解决!
EMQ中CPU是公平分配给MQTT会话,大量pub消息到一个订阅,订阅不会拿到更多cpu,最终导致消息累积,内存溢出宕机。
最好的解决办法是分组订阅,把消息打散,多个客户端订阅。
问:请问一下,我现在的业务就是只使用一个sub,主题是hello#,去订阅数万个终端消息。请问针对这个问题,如何来优化业务逻辑?可以通过增加sub的方式吗?即把数万终端分成几个小组,每小组往一个主题pub,然后再分别订阅?
答:不需要自己实现,使用emq 2.x的本地+共享订阅相结合即可。使用主题:$local/$share/group/topic
http://emqtt.com/docs/v2/advanced.html#local-subscription
高级特性 (Advanced Features)
EMQ 2.0 版本新增了本地订阅与共享订阅功能。
简介
使用本地订阅后,指消息只在订阅者的本地(所连接的)EMQ节点,不会流传到集群中的其它EMQ节点中。在共享订阅中,订阅同一个主题的客户端会轮流的收到这个主题下的消息,也就是说同一个消息不会发送到多个订阅者,从而实现订阅端的多个节点之间的负载均衡。共享订阅对于数据采集/集中处理类应用非常有用。在这样的场景下,数据的生产者远多余数据的消费者,且同一条数据只需要被任意消费者处理一次。
本地订阅 (Local Subscription)
本地订阅(Local Subscription) 只在本节点创建订阅与路由表,不会在集群节点间广播全局路由,非常适合物联网数据采集应用:
mosquitto_sub -t '$local/topic'
mosquitto_pub -t 'topic'
使用方式: 订阅者在主题(Topic)前增加 ‘$local/’ 前缀。
emq2.x版本,共享订阅只支持单节点,不支持集群。
使用场景
当生产者和消费者的消息只想通过一个EMQ节点,可使用EMQ的本地订阅。
当消费者的消息想通过EMQ实现订阅端的多个消费者之间的负载均衡,则可使用EMQ的共享订阅。
特殊情况下,当多个生产者生产多条消息的时候,一个消费者压力会很大,分担一个消费者的压力,或者其它情况,需要用到本地共享订阅。本地共享订阅是本地订阅与共享订阅的组合。
下图为本地共享订阅的消息走向和订阅关系。每个消费者都必须本地共享订阅每一个EMQ节点,这样每条消息只会走向一个消费者。注意:这里的SUB指消费者,PUB指生产者。
消息流向
每个PUB的消息从经过LB(负载均衡),发送到不同的EMQ节点中,比如第一个EMQ节点收到的M1、M3、M4的消息:
通过本地订阅,这个EMQ节点的消息把收到的M1、M3、M4的消息不发给其它集群的EMQ节点,只从这个EMQ节点发送给订阅的SUB。
通过共享订阅,这个EMQ的消息把收到的M1、M3、M4的消息发送给不同的SUB端。
通过上述本地订阅+共享订阅,实现多个PUB发送的每条消息随机到达一个并且只有一个SUB。
订阅关系
每个SUB使用本地共享订阅($local/$share/A)来订阅EMQ集群中的每个EMQ节点。
.