MQTT是一款基于topic消息发布、订阅的产品,普遍应用于物联网当中,有三个角色,发布者、broker、订阅者,消息由发布者发到broker中,然后由broker将消息推送到订阅者;
MQTT特点:
1、轻量级:体现在消息体小,对header做了简化
消息分为固定头、可变头、消息体,在后面会单独说明;
2、提供了qos,保证不同场景的消息传递质量
0:消息只发一次,不管订阅者是否收到,类似rocketMQ的广播消息;
1:消息发到broker后等到broker返回接收成功,如果没有收到broker的返回 则间隔一段时间再次发送,订阅者可能会收到多次,重复消费,类似rocketMQ的同步消息;
2:订阅者只成功消费一次,适合对业务数据要求比较高的场景,例如 转账;
qos的降级:如果生产者和发布者的qos不一样,则订阅者以两者中最小的qos为准;
qos=0消息流程最简单所以吞吐量越高;
qos=1等到对方确认收到消息后才算成功,如果没有收到对方确认消息会多次发送;
qos=2 生产者发mes给broker,broker收到消息后返回PUBREC,然后生产者发PUBREL消息,broker收到消息后返回PUBCOMP;
1、如果生成者没有收到PUBREC而多次发了msg,broker以收到PUBREL消息为准将之前的重复msg丢弃、只保留一条;
2、如果生产者没有收到PUMCOMP而发了多条PUBREL,broker中会根据消息id判断是否重复,如果有重复就丢弃;这样就保证了在broker中只存在一条有效数据;
broker发消息给订阅者 和 生产者发消息给broker的流程是一样的;
3、topic:使用多层级的方式
在订阅者中topic可以使用通配符,通配符有两个:+ 和 #
生产者中不能使用通配符,必须是明确定义的topic,如 /a/b/c
在订阅者中可以使用 /a/+/c、/a/b/+、/a/* 等通配符方式类订阅 /a/b/c 的消息;、
这样就实现了一个订阅者可以订阅大量生产者的消息;
MQTT协议中的方法,也就是消息类型:
消息的组成:
1、固定头
分两部分,第一部分一个字节(8位字符)是固定的,前面四位表示消息的类型(上面的15种方法),从 0000到1111,后面四位表示消息的qos、是否重复 消息等;
前四位:
后四位:
第二部分表示表示消息的大小,根据消息体的大小 这一部分固定头的长度也不固定,范围是0-4个字节,每个字节都是 0或1 组成的8位字符,其中最高位表示是否超出了这个长度;
如一个消息体很小,一个字节的范围内(128位字符)就可以表示,则第8位为0,这一部分的长度就是1个字节,如果超出了128位字符第一个字节就不够了,此时第一个字节的第8为就是1,需要用到第二个字节,此时这一部分长度为2个字节;最极端的情况是4个字节全部是1,此时表示的最大长度是256M,所以MQTT的单个消息不能超过256M;
固定头是每个消息都有的,但是长度是不固定的,范围是 2-5个字节;
2、可变头:
可变头存储的是消息相关的属性,如协议名、协议版本号(客户端MQTT版本号)、心跳时长(链接请求)、主题名、消息ID 等,有效消息类型是没有可变头的,而且不同的消息类型可变头中的内容也不一样;
3、消息体
消息体就是实际发送的数据,有些报文类型是没有消息体的;
PUBLISH的消息体就是指消息内容,CONNECT的消息体则包含Client Identifier,Username,Password等信息。