MQTT Broker mosquitto

眉间皱痕 提交于 2021-02-10 18:35:09

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:
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!