spelling syntax
This commit is contained in:
parent
fd15099f74
commit
c0cc696b52
|
@ -11,51 +11,44 @@ Design Guide
|
||||||
Architecture
|
Architecture
|
||||||
------------
|
------------
|
||||||
|
|
||||||
Concept Model
|
The emqttd broker 1.0 is more like a network Switch or Router, not a traditional enterprise message queue. Compared to a network router that routes packets based on IP or MPLS label, the emqttd broker routes MQTT messages based on topic trie.
|
||||||
-------------
|
|
||||||
|
|
||||||
The emqttd broker 1.0 is more like a network Switch or Router, not traditional enterprise message queue. Compared to a network router that routes packets based on IP or MPLS label, the emqttd broker routes MQTT messages based on a topic trie.
|
|
||||||
|
|
||||||
.. image:: _static/images/concept.png
|
.. image:: _static/images/concept.png
|
||||||
|
|
||||||
Design Philosophy
|
Design Philosophy
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
1. Focus on handling millions of MQTT connections and route MQTT messages between clustered nodes.
|
1. Focus on handling millions of MQTT connections and routing MQTT messages between clustered nodes.
|
||||||
|
|
||||||
2. Embrace Erlang/OTP, The Soft-Realtime, Low-Latency, Concurrent and Fault-Tolerant platform.
|
2. Embrace Erlang/OTP, The Soft-Realtime, Low-Latency, Concurrent and Fault-Tolerant Platform.
|
||||||
|
|
||||||
3. Connection, Session, PubSub, Router and Distributed Layers.
|
3. Layered Design: Connection, Session, PubSub and Router Layers.
|
||||||
|
|
||||||
4. Seperate the Message Flow Plane and Control/Management Plane.
|
4. Separate the Message Flow Plane and the Control/Management Plane.
|
||||||
|
|
||||||
5. Stream out the MQTT messages to various backends.
|
5. Stream MQTT messages to various backends including MQ or databases.
|
||||||
|
|
||||||
System Layers
|
System Layers
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
1. Connection Layer:
|
||||||
|
Handle TCP and WebSocket connections, encode/decode MQTT packets.
|
||||||
|
|
||||||
|
2. Session Layer:
|
||||||
|
Process MQTT PUBLISH/SUBSCRIBE Packets received from client, and deliver MQTT messages to client.
|
||||||
|
|
||||||
|
3. PubSub Layer:
|
||||||
|
Dispatch MQTT messages to subscribers in a node.
|
||||||
|
|
||||||
|
4. Routing(Distributed) Layer:
|
||||||
|
Route MQTT messages between clustered nodes.
|
||||||
|
|
||||||
.. code::
|
.. code::
|
||||||
|
|
||||||
-------------- ----------- ---------- ----------
|
-------------- ----------- ---------- ----------
|
||||||
Client --> | Connection | --> | Session | --> | PubSub | --> | Router |
|
Client --> | Connection | --> | Session | --> | PubSub | --> | Router |
|
||||||
-------------- ----------- ---------- ----------
|
-------------- ----------- ---------- ----------
|
||||||
|
|
||||||
1. Connection Layer:
|
|
||||||
|
|
||||||
Handle TCP and WebSocket connections, encode/decode MQTT packets.
|
|
||||||
|
|
||||||
2. Session Layer:
|
|
||||||
|
|
||||||
Process MQTT PUBLISH/SUBSCRIBE Packets recevied from client, and deliver MQTT messages to client.
|
|
||||||
|
|
||||||
3. PubSub Layer:
|
|
||||||
|
|
||||||
Route and dispatch MQTT messages to subscribers in a node
|
|
||||||
|
|
||||||
4. Route(Distributed) Layer:
|
|
||||||
|
|
||||||
Route MQTT messages between nodes in a cluster
|
|
||||||
|
|
||||||
----------------
|
----------------
|
||||||
Connection Layer
|
Connection Layer
|
||||||
----------------
|
----------------
|
||||||
|
@ -96,7 +89,7 @@ Main modules of this layer:
|
||||||
Session Layer
|
Session Layer
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
The session layer processes MQTT PUBLISH/SUBSCRIBE packets received from client, and deliver PUBLISH packets to client.
|
The session layer processes MQTT packets received from client, and deliver PUBLISH packets to client.
|
||||||
|
|
||||||
A MQTT session will store the subscriptions and inflight messages in memory:
|
A MQTT session will store the subscriptions and inflight messages in memory:
|
||||||
|
|
||||||
|
@ -105,14 +98,12 @@ A MQTT session will store the subscriptions and inflight messages in memory:
|
||||||
2. Inflight qos1/2 messages sent to the client but unacked, QoS 2 messages which
|
2. Inflight qos1/2 messages sent to the client but unacked, QoS 2 messages which
|
||||||
have been sent to the Client, but have not been completely acknowledged.
|
have been sent to the Client, but have not been completely acknowledged.
|
||||||
|
|
||||||
3. Inflight qos2 messages received from client and waiting for pubrel. QoS 2
|
3. Inflight qos2 messages received from client and waiting for PUBREL. QoS 2
|
||||||
messages which have been received from the Client, but have not been
|
messages which have been received from the Client, but have not been
|
||||||
completely acknowledged.
|
completely acknowledged.
|
||||||
|
|
||||||
4. All qos1, qos2 messages published to when client has been disconnected.
|
4. All qos1, qos2 messages published to when client has been disconnected.
|
||||||
|
|
||||||
Main module of this layer is emqttd_session.
|
|
||||||
|
|
||||||
MQueue and Inflight Window
|
MQueue and Inflight Window
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
|
@ -124,7 +115,7 @@ IN -> | Messages Queue | Inflight Window | -> Out
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
|<--- Win Size --->|
|
|<--- Win Size --->|
|
||||||
|
|
||||||
1. Inflight Window to store the messages delivered and awaiting for puback.
|
1. Inflight Window to store the messages delivered and awaiting for PUBACK.
|
||||||
|
|
||||||
2. Enqueue messages when the inflight window is full.
|
2. Enqueue messages when the inflight window is full.
|
||||||
|
|
||||||
|
@ -136,9 +127,9 @@ The larger the inflight window size, the higher the throughput. The smaller the
|
||||||
PacketId and MessageId
|
PacketId and MessageId
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
The 16bits PacketId is defined by MQTT Protocol Specification, used by client/server to PUBLISH/PUBACK packets. A GUID(128bits global unique Id) will be generated by the borker and assigend to a MQTT message.
|
The 16bits PacketId is defined by MQTT Protocol Specification, used by client/server to PUBLISH/PUBACK packets. A GUID(128bits global unique Id) will be generated by the broker and assigned to a MQTT message.
|
||||||
|
|
||||||
Format of the global unique messsage id::
|
Format of the global unique message id::
|
||||||
|
|
||||||
+------------------------+----------------+------------+
|
+------------------------+----------------+------------+
|
||||||
| Timestamp | NodeID + PID | Sequence |
|
| Timestamp | NodeID + PID | Sequence |
|
||||||
|
@ -186,7 +177,7 @@ For example, if node1 subscribed 't/+/x' and 't/+/y', node2 subscribed 't/#' and
|
||||||
| t/a -> node3 |
|
| t/a -> node3 |
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
The routing layer would route MQTT messages between clustered nodes by topic trie match and routing table lookup, and follow the ruels below:
|
The routing layer would route MQTT messages between clustered nodes by topic trie match and routing table lookup, and follow the rules below:
|
||||||
|
|
||||||
1. A message only gets forwarded to other cluster nodes if a cluster node is interested in it. This reduces the network traffic tremendously, because it prevents nodes from forwarding unnecessary messages.
|
1. A message only gets forwarded to other cluster nodes if a cluster node is interested in it. This reduces the network traffic tremendously, because it prevents nodes from forwarding unnecessary messages.
|
||||||
|
|
||||||
|
@ -206,10 +197,10 @@ emqttd_access_control module provides two APIs that help register/unregister aut
|
||||||
|
|
||||||
register_mod(auth | acl, atom(), list(), non_neg_integer()) -> ok | {error, any()}.
|
register_mod(auth | acl, atom(), list(), non_neg_integer()) -> ok | {error, any()}.
|
||||||
|
|
||||||
Authentication Bahavihour
|
Authentication Bahaviour
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
The emqttd_auth_mod defines an Erlang behavihour for authentication module::
|
The emqttd_auth_mod defines an Erlang behaviour for authentication module::
|
||||||
|
|
||||||
-module(emqttd_auth_mod).
|
-module(emqttd_auth_mod).
|
||||||
|
|
||||||
|
@ -337,7 +328,7 @@ Hooks defined by the emqttd 1.0 broker:
|
||||||
+------------------------+------------------------------------------------------+
|
+------------------------+------------------------------------------------------+
|
||||||
| message.acked | Run when a MQTT message is acked |
|
| message.acked | Run when a MQTT message is acked |
|
||||||
+------------------------+------------------------------------------------------+
|
+------------------------+------------------------------------------------------+
|
||||||
| client.disconnected | Run when client disconnnected from broker |
|
| client.disconnected | Run when client disconnected from broker |
|
||||||
+------------------------+------------------------------------------------------+
|
+------------------------+------------------------------------------------------+
|
||||||
|
|
||||||
The emqttd broker uses the `Chain-of-responsibility_pattern`_ to implement hook mechanism. The callback functions registered to hook will be executed one bye one::
|
The emqttd broker uses the `Chain-of-responsibility_pattern`_ to implement hook mechanism. The callback functions registered to hook will be executed one bye one::
|
||||||
|
|
Loading…
Reference in New Issue