MQTT
全称
MQ Telemetry Transport 消息队列遥测传输协议 IBM 1994开发 MQTT v3.1.1 第4版 OASIS标准 1 to 0/1/N
简介
MQTT是一个TCP服务端,称为broker。 通过这个broker服务,我们可以作为发布者,发送一条主题消息给broker,然后其他订阅者通过消息订阅机制获得broker的主题消息推送。我们也可以作为订阅者,订阅其他发布者的主题消息。
对比MQ
消息队列存储消息,直到它们被消耗 消息队列中只有一个消费者处理消息,MQTT中订阅主题的每个订阅者都会收到消息 消息队列要提前并明确创建,MQTT中可以随时实时创建
议题
- 自动重连 Automatic Reconnect
- 离线缓存 Offline Buffering
- 消息持久化 Message Persistence
- 高可用 High Availability
- 安全 SSL/TLS
- websocket支持
连接
建立
broker开启一个host的TCP 1883端口 客户端连接Broker 如果是重连,需要带上上次ClientID 如果不是重连,可以指定CleanSession是否清空之前会话 可以指定两端之间心跳维持时间 服务端根据参数,重用或开启会话Session,绑定ClientID 一个会话,可以服务多个TCP连接,取决于是否CleanSession
会话
PersistentSession与CleanSession session相关信息将会同时保存在broker和client中,session里包含以下内容: 客户端的订阅信息 从broker接收来的还没有ack的消息 发送给client的还没有ack的消息
断开
客户端主动断开:客户端发送 DISCONNECT 关闭链接,遗嘱失效并删除 客户端异常断开:遗嘱消息发布
消息
消息类型
心跳消息 连接、断开连接消息 10 e0 订阅、取消订阅消息 80 发布消息 30
遗嘱消息
为了能知道哪个客户端异常断开,broker定时查询客户端状态。 当检查到客户端异常断开时,就发布客户端连接时指定的遗嘱消息到指定主题。 正常断开,是不会有遗嘱消息发布的。
保留消息
发布者发布主题消息时,可以指定消息是否缓存到broker,作为对应主题的最后一次消息记录 订阅者连接后,可一次性获取想要的主题的全部保留消息
主题
分层过滤格式
树状结构,用'/'分隔,如:home/light/brightness 通配符:
- 单层通配符 如,a/b/+” 匹配 “a/b/c1” 和 “a/b/c2”,但是不匹配 “a/b/c/d”
多层通配符 如 “a/b/c/#" 可以匹配 “a/b/c”、“a/b/c/d” 和 “a/b/c/d/e”
特殊的主题$SYS
查看服务器的状态信息
消息分发可靠性QoS
- 至多一次 允许丢失,无需回复订阅者回复,发布者自动删除。适用传感器数据
- 至少一次 确保到达,需要订阅者回复,发布者和broker都缓存消息,待订阅者回复后,再依次删除消息缓存。可能重复发送
- 只有一次 确保到达,不重复不丢失,用的很少 图示
消息发布与订阅
基于主题的消息过滤,可以使用通配符来订阅多个主题的消息 发布消息时,不可以使用通配符,必须指定完整的topic名 如果想发送给多个topic,需要发布多次 发布者在每次发布消息时都需要设置QoS
消息存储
可以使用基于内存的,但是单点故障情况下,消息会丢失。 可以结合外部redis,进行消息外部存储。
redis消息持久化配置
storage_class io.moquette.persistence.redis.RedisStorageService
# redis storage
redis.host localhost
redis.port 6379
redis.password
redis.database 0
redis.prefix monitor:
来源:oschina
链接:https://my.oschina.net/u/4302666/blog/3570437