MQTT broker的主要作用有两个,处理Publisher发布的消息,将消息投递给对应的Subscriber。

服务器的设计因此也分为几个模块:

  • Server(broker)模块,接收客户端的连接并分发。
  • Connection,客户端连接的抽象,维护了Connection的必要状态,包括最后一次活跃时间,消息发送队列等。
  • Subscription Tree,一棵基数树,用来保存所有的订阅关系。
  • Arrival Service,消息的重发模块,用来实现Qos1/2的服务质量。

下面的时序图展示了一个客户端和服务器的交互流程,以及服务器端对客户端发送的消息的处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
sequenceDiagram
    participant Client
    participant Broker
    participant Connection
    participant Auth
    participant Storage
    Note over Broker: 启动服务并监听端口
    Client->>Broker: 连接
    Broker->>Connection: 处理新的连接
    Connection->>Auth: 读取Connect消息并进行认证
    Auth->>Connection: 认证完成
    rect rgb(166, 212, 250)
        alt 认证失败
        Connection->>Client: 返回带有错误码的Connack
        else 认证成功
        Connection->>Client: 正常返回Connack
        Connection->>Storage: 存储Connection信息
        end
    end
    rect rgb(246, 165, 192)
        loop Read Msg
        alt Pingreq
            Connection->>Client: Pingresp
        else Subscribe
            Connection->>Auth: 依据Topic和Qos进行ACL鉴权认证
            Auth->>Connection: 认证完成
            rect rgb(0, 255, 0)
                alt 鉴权成功
                    Connection->>Storage: 存储订阅关系
                    Connection->>Client: 返回订阅成功的状态
                else 鉴权失败
                    Connection->>Client: 返回订阅失败的状态
                end
            end
        else Unsubscribe
                Connection->>Storage: 删除订阅关系
                Connection->>Client: Unsuback
        else Disconnect
            Connection->>Storage: 删除对应的Connection信息
            Broker->>Client: 关闭连接
        else Publish[^QOS]
        else Puback
        else Pubrec
        else Pubrel
        else Pubcomp
        end
        end
    end

7000 14500->16500 30000->35000