zoukankan      html  css  js  c++  java
  • MQTT Broker mosquitto

    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:
    
  • 相关阅读:
    LeetCode 24. Swap Nodes in Pairs (两两交换链表中的节点)
    LeetCode 1041. Robot Bounded In Circle (困于环中的机器人)
    LeetCode 1037. Valid Boomerang (有效的回旋镖)
    LeetCode 1108. Defanging an IP Address (IP 地址无效化)
    LeetCode 704. Binary Search (二分查找)
    LeetCode 744. Find Smallest Letter Greater Than Target (寻找比目标字母大的最小字母)
    LeetCode 852. Peak Index in a Mountain Array (山脉数组的峰顶索引)
    LeetCode 817. Linked List Components (链表组件)
    LeetCode 1019. Next Greater Node In Linked List (链表中的下一个更大节点)
    29. Divide Two Integers
  • 原文地址:https://www.cnblogs.com/cenon/p/10723253.html
Copyright © 2011-2022 走看看