关于EMQ的一些特性需要注意的地方

场景

用EMQ也有2年时间了,期间也遇到各种各样的问题,整理了一些要点分享一下。

示例

//Java例子
MqttClient client = new MqttClient("地址","客户端ID");
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(false);//设置清除会话
options.setUserName("用户名");//设置用户名
options.setPassword("密码".toCharArray());//设置密码
client.setCallback(new PushCallback());//回调
client.connect(options);//连接
client.subscribe("主题", 0);//订阅主题

特性

1、MQTT客户端的Options是否设置了CleanSession为0(0或1,false或true);

首先,不管CleanSession设为true还是false,一旦客户端进行连接,MQTT服务器都会生成2个进程:

一个是TCP层负责跟客户端进行通讯的进程

另一个是该客户端的Session进程,专门负责该客户端订阅的主题,如果主题收到消息会先保留在Session,然后看对应client是否活着,活着就会通过它把消息发送出去。

知道了上述的情况后,我们再看一下CleanSession设置true和false的区别

官方文档是这样写的

如果CleanSession设置为true:客户端连接后,会在MQTT服务器创建一个新的临时会话(Session),在客户端断开时,Session自动销毁。

如果CleanSession设置为false:客户端连接后,会在MQTT服务器创建一个持久会话(Session),在客户端断开时,Session不会销毁,仍会保持并继续接收该客户端订阅的主题消息(注1),直到会话超时注销。

注1:如果原本的客户端重新连接到服务器,Session会把断线期间收到的消息发给客户端,匹配客户端的条件是通过ClientID,所以如果每次连接的ClientID都不相同的话,则没必要设置CleanSession为false,这样会造成资源浪费。

然后我们再来看下官方给出的Session过期时间

v1.0版本的EMQ

v2.0版本的EMQ

在V1.0的EMQ,Session的过期时间是2天

在V2.0的EMQ,Session的过期时间是2小时(官方文档写着2小时,但实际看了测试环境和线上装的EMQ2.0配置文件,写着的是2天和1天)

2、发布消息的Qos和订阅消息的Qos

 

 

 

注:仅供自己学习,记录问题和参考,若有带来误解和不便请见谅,共勉!

 

猜你喜欢

转载自blog.csdn.net/u011267225/article/details/82492292