From 4495d61c62c77ef37e1a4d8c0c5bfd237dcac9fb Mon Sep 17 00:00:00 2001 From: Feng Date: Sat, 26 Mar 2016 19:01:33 +0800 Subject: [PATCH 01/14] a --- src/emqttd_plugins.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/emqttd_plugins.erl b/src/emqttd_plugins.erl index ee1935217..271b9bd08 100644 --- a/src/emqttd_plugins.erl +++ b/src/emqttd_plugins.erl @@ -101,7 +101,7 @@ plugin(PluginsDir, AppFile0) -> Descr = proplists:get_value(description, Attrs, ""), #mqtt_plugin{name = Name, version = Ver, config = AppsEnv1, descr = Descr}. -%% @doc Load One Plugin +%% @doc Load a Plugin -spec(load(atom()) -> ok | {error, any()}). load(PluginName) when is_atom(PluginName) -> case lists:member(PluginName, names(started_app)) of @@ -161,7 +161,7 @@ find_plugin(Name) -> find_plugin(Name, Plugins) -> lists:keyfind(Name, 2, Plugins). -%% @doc UnLoad One Plugin +%% @doc UnLoad a Plugin -spec(unload(atom()) -> ok | {error, any()}). unload(PluginName) when is_atom(PluginName) -> case {lists:member(PluginName, names(started_app)), lists:member(PluginName, names(plugin))} of From 5412dda622c1d28b44299946a698acb64347d5c2 Mon Sep 17 00:00:00 2001 From: Feng Date: Sun, 27 Mar 2016 20:11:02 +0800 Subject: [PATCH 02/14] dashboard --- docs/source/_static/images/dashboard.png | Bin 114427 -> 131596 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/source/_static/images/dashboard.png b/docs/source/_static/images/dashboard.png index 7506ccb392aeceeaf05eb3a7a64a2f533bf789c9..ed69a72496435dd67af775deecc424c746ed214e 100644 GIT binary patch literal 131596 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 literal 114427 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 From a758423a2ec38c8362d4f7a1807ec2795b2b0859 Mon Sep 17 00:00:00 2001 From: Feng Date: Wed, 30 Mar 2016 19:33:53 +0800 Subject: [PATCH 03/14] fix issue #486 - gen_server2:call/3 to register a client --- src/emqttd_cm.erl | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/emqttd_cm.erl b/src/emqttd_cm.erl index 34a130508..f78db2ad0 100644 --- a/src/emqttd_cm.erl +++ b/src/emqttd_cm.erl @@ -70,14 +70,14 @@ lookup_proc(ClientId) when is_binary(ClientId) -> %% @doc Register ClientId with Pid. -spec(register(Client :: mqtt_client()) -> ok). register(Client = #mqtt_client{client_id = ClientId}) -> - CmPid = gproc_pool:pick_worker(?POOL, ClientId), - gen_server2:cast(CmPid, {register, Client}). + gen_server2:call(pick(ClientId), {register, Client}, 120000). %% @doc Unregister clientId with pid. -spec(unregister(ClientId :: binary()) -> ok). unregister(ClientId) when is_binary(ClientId) -> - CmPid = gproc_pool:pick_worker(?POOL, ClientId), - gen_server2:cast(CmPid, {unregister, ClientId, self()}). + gen_server2:cast(pick(ClientId), {unregister, ClientId, self()}). + +pick(ClientId) -> gproc_pool:pick_worker(?POOL, ClientId). %%-------------------------------------------------------------------- %% gen_server callbacks @@ -85,16 +85,16 @@ unregister(ClientId) when is_binary(ClientId) -> init([Pool, Id, StatsFun]) -> ?GPROC_POOL(join, Pool, Id), - {ok, #state{pool = Pool, id = Id, - statsfun = StatsFun, - monitors = dict:new()}}. + {ok, #state{pool = Pool, id = Id, statsfun = StatsFun, monitors = dict:new()}}. -prioritise_call(_Req, _From, _Len, _State) -> - 1. +prioritise_call(Req, _From, _Len, _State) -> + case Req of + {register, _Client} -> 2; + _ -> 1 + end. prioritise_cast(Msg, _Len, _State) -> case Msg of - {register, _Client} -> 2; {unregister, _ClientId, _Pid} -> 9; _ -> 1 end. @@ -102,19 +102,19 @@ prioritise_cast(Msg, _Len, _State) -> prioritise_info(_Msg, _Len, _State) -> 3. -handle_call(Req, _From, State) -> - ?UNEXPECTED_REQ(Req, State). - -handle_cast({register, Client = #mqtt_client{client_id = ClientId, - client_pid = Pid}}, State) -> +handle_call({register, Client = #mqtt_client{client_id = ClientId, + client_pid = Pid}}, _From, State) -> case lookup_proc(ClientId) of Pid -> - {noreply, State}; + {reply, ok, State}; _ -> ets:insert(mqtt_client, Client), - {noreply, setstats(monitor_client(ClientId, Pid, State))} + {reply, ok, setstats(monitor_client(ClientId, Pid, State))} end; +handle_call(Req, _From, State) -> + ?UNEXPECTED_REQ(Req, State). + handle_cast({unregister, ClientId, Pid}, State) -> case lookup_proc(ClientId) of Pid -> From e511f6d89c2ced2ab796c8c8f5cc65ef7802fb61 Mon Sep 17 00:00:00 2001 From: Feng Date: Thu, 31 Mar 2016 13:32:38 +0800 Subject: [PATCH 04/14] helps --- docs/source/plugins.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/plugins.rst b/docs/source/plugins.rst index c1e4cfdb0..286ad1940 100644 --- a/docs/source/plugins.rst +++ b/docs/source/plugins.rst @@ -426,7 +426,7 @@ http://localhost:61616/index.html emqttd_recon - Recon Plugin --------------------------- -The plugin loads `recon`_ library on a running emqttd broker. Recon libray helps to debug and optimize an Erlang application. +The plugin loads `recon`_ library on a running emqttd broker. Recon libray helps debug and optimize an Erlang application. Load emqttd_recon Plugin ------------------------ From ac9046bdce1aa8363491e1ae7444cc302bb8d8c7 Mon Sep 17 00:00:00 2001 From: Feng Date: Thu, 31 Mar 2016 21:30:16 +0800 Subject: [PATCH 05/14] doc review --- docs/source/getstarted.rst | 4 ++-- docs/source/guide.rst | 2 +- docs/source/install.rst | 31 ++++++++++++++++++++++++------- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/docs/source/getstarted.rst b/docs/source/getstarted.rst index a9c9c5e5c..37e608d8b 100644 --- a/docs/source/getstarted.rst +++ b/docs/source/getstarted.rst @@ -55,11 +55,11 @@ Quick Start Download and Install -------------------- -The emqttd broker is cross-platform, could be deployed on Linux, Mac, FreeBSD, Windows and Raspberry Pi. +The emqttd broker is cross-platform, which could be deployed on Linux, FreeBSD, Mac, Windows and even Raspberry Pi. Download binary package from: http://emqtt.io/downloads. -Installing on Mac, For example: +Installing on Mac, for example: .. code:: console diff --git a/docs/source/guide.rst b/docs/source/guide.rst index c988d5abb..bc7963f1e 100644 --- a/docs/source/guide.rst +++ b/docs/source/guide.rst @@ -450,7 +450,7 @@ MQTT(SSL) Listener, Default Port is 8883:: HTTP Publish API ---------------- -The emqttd broker provides a HTTP API to help application servers to publish messages to MQTT clients. +The emqttd broker provides a HTTP API to help application servers publish messages to MQTT clients. HTTP API: POST http://host:8083/mqtt/publish diff --git a/docs/source/install.rst b/docs/source/install.rst index 9e09ee1f4..962d37d41 100644 --- a/docs/source/install.rst +++ b/docs/source/install.rst @@ -1,17 +1,21 @@ -======================= +.. _install: + +============ Installation -======================= +============ -emqttd broker is cross-platform, could deploy on Linux, FreeBSD, Mac OS X and Windows. +The emqttd broker is cross-platform, which could be deployed on Linux, FreeBSD, Mac, Windows and even Raspberry Pi. .. NOTE:: Linux, FreeBSD Recommended. ------------------ -Download Package ------------------ +.. _install_download: + +---------------- +Download Package +---------------- Download binary package from: http://emqtt.io/downloads @@ -31,6 +35,8 @@ The package name consists of platform, version and release time. For example: emqttd-centos64-0.16.0-beta-20160216.zip +.. _install_on_linux: + -------------------- Installing on Linux -------------------- @@ -47,7 +53,7 @@ Start the broker in console mode:: cd emqttd && ./bin/emqttd console -If the broker started successfully, console will print: +If the broker is started successfully, console will print: .. code:: console @@ -102,6 +108,7 @@ Stop the broker:: ./bin/emqttd stop +.. _install_on_freebsd: --------------------- Installing on FreeBSD @@ -111,6 +118,7 @@ Download FreeBSD Package from: http://emqtt.io/downloads/freebsd The installing process is same to Linux. +.. _install_on_mac: ---------------------- Installing on Mac OS X @@ -134,6 +142,8 @@ Configure 'lager' log level in 'etc/emqttd.config', all MQTT messages recevied/s The install and boot process on Mac are same to Linux. +.. _install_on_windows: + --------------------- Installing on Windows --------------------- @@ -168,6 +178,8 @@ Uninstall emqttd service:: .. WARNING:: './bin/emqttd_ctl' command line cannot work on Windows. +.. _build_from_source: + ---------------------- Installing From Source ---------------------- @@ -194,6 +206,8 @@ The binary package output in folder:: rel/emqttd +.. _tcp_ports: + ------------------ TCP Ports Occupied ------------------ @@ -228,6 +242,8 @@ The TCP ports could be configured in etc/emqttd.config: The 18083 port is used by Web Dashboard of the broker. Default login: admin, Password: public +.. _quick_setup: + ----------- Quick Setup ----------- @@ -272,6 +288,7 @@ etc/emqttd.config文件listeners段落设置最大允许连接数: emqttd消息服务器详细设置,请参见文档: :ref:`config` +.. _init_d_emqttd: ------------------- /etc/init.d/emqttd From f6d45d81ff081d126a300e2b161669752e56871f Mon Sep 17 00:00:00 2001 From: Feng Date: Fri, 1 Apr 2016 13:44:02 +0800 Subject: [PATCH 06/14] design draft --- docs/source/design.rst | 604 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 583 insertions(+), 21 deletions(-) diff --git a/docs/source/design.rst b/docs/source/design.rst index 729f82dbc..da6da0e28 100644 --- a/docs/source/design.rst +++ b/docs/source/design.rst @@ -1,6 +1,581 @@ -============== + +.. _design: + +============ Design Guide -============== +============ + +.. _design_intro: + +---------------- +About emqttd 1.0 +---------------- + +Finally, we decide to tag emqttd 1.0 after two years development. An experimental project that try to introcude MQTT protocol to SCADA system. + + +emqttd消息服务器1.0版本经过两年时间开发,开发方式有点像摇滚乐专辑的制作,最初从0.1版本一些即兴创作的部分开始,但最终在各层架构设计上做出了正确的选择,整体上体现了某种程度的正交(Orthogonality)和一致性(Consistency)。emqttd 1.0可能是目前开源领域唯一一个,几乎不需要用户做太多努力就可以支持到100万连接的MQTT服务器。 + +C1000K Problem +-------------- + +多核服务器和现代操作系统内核层面,可以很轻松支持100万TCP连接,核心问题是应用层面如何处理业务瓶颈。 + +emqttd消息服务器在业务和应用层面,解决了承载100万连接的各类瓶颈问题。连接测试的操作系统内核、TCP协议栈、Erlang虚拟机参数: http://docs.emqtt.cn/zh_CN/latest/tune.html + +Fully Asynchronous +------------------ + +emqttd消息服务器是基于Erlang/OTP平台的全异步的架构:异步TCP连接处理、异步主题(Topic)订阅、异步消息发布。只有在资源负载限制部分采用同步设计,比如TCP连接创建和Mnesia数据库事务执行。 + +一条MQTT消息从发布者(Publisher)到订阅者(Subscriber),在emqttd消息服务器内部异步流过一系列Erlang进程Mailbox:: + + ---------- ----------- ---------- + Publisher --Msg-->| Client | --Msg--> | Session | --Msg--> | Client | --Msg--> Subscriber + ---------- ----------- ---------- + +Message Persistence? +-------------------- + +emqttd1.0版本不支持服务器内部消息持久化,这是一个架构设计选择。首先,emqttd解决的核心问题是连接与路由;其次,我们认为内置持久化是个错误设计。 + +传统内置消息持久化的MQ服务器,比如广泛使用的JMS服务器ActiveMQ,几乎每个大版本都在重新设计持久化部分。内置消息持久化在设计上有两个问题: + +1. 如何平衡内存与磁盘使用?消息路由基于内存,消息存储是基于磁盘。 + +2. 多服务器分布集群架构下,如何放置Queue?如何复制Queue的消息? + +Kafka在上述问题上,做出了正确的设计:一个完全基于磁盘分布式commit log的消息服务器。 + +emqttd2.0版本计划通过外部存储,例如Redis、Kafka、Cassandra、PostgreSQL,实现多种方式的消息持久化。 + +设计上分离消息路由与消息存储职责后,数据复制容灾备份甚至应用集成,可以在数据层面灵活实现。 + +NetSplit Problem +---------------- + +The emqttd broker cluster requires reliable network to avoid NetSplit. + +emqttd1.0消息服务器集群,基于Mnesia数据库设计。NetSplit发生时,节点间状态是:Erlang节点间可以连通,互相询问自己是否宕机,对方回答你已经宕机:( + +NetSplit故障发生时,emqttd消息服务器的log/emqttd_error.log日志,会打印critical级别日志:: + + Mnesia inconsistent_database event: running_partitioned_network, emqttd@host + +emqttd集群部署在同一IDC网络下,NetSplit发生的几率很低,一旦发生又很难自动处理。所以emqttd1.0版本设计选择是,集群不自动化处理NetSplit,需要人工重启部分节点。 + +.. _design_architecture: + +------------ +Architecture +------------ + +Concept Model +------------- + +emqttd消息服务器概念上更像一台网络路由器(Router)或交换机(Switch),而不是传统的企业级消息服务器(MQ)。相比网络路由器按IP地址或MPLS标签路由报文,emqttd按主题树(Topic Trie)发布订阅模式在集群节点间路由MQTT消息: + +.. image:: _static/images/concept.png + +Design Principle +---------------- + +1. emqttd消息服务器核心解决的问题:处理海量的并发MQTT连接与路由消息。 + +2. 充分利用Erlang/OTP平台软实时、低延时、高并发、分布容错的优势。 + +3. 连接(Connection)、会话(Session)、路由(Router)、集群(Cluster)分层。 + +4. 消息路由平面(Flow Plane)与控制管理平面(Control Plane)分离。 + +5. 支持后端数据库或NoSQL实现数据持久化、容灾备份与应用集成。 + +System Layers +------------- + +1. Network Layer: 负责TCP连接处理、MQTT协议编解码。 + +2. Session Layer: 处理MQTT协议发布订阅消息交互流程。 + +3. PubSub Layer: 节点内路由派发MQTT消息。 + +4. Route Layer: 分布节点间路由MQTT消息。 + +5. Authentication and ACL: 连接层支持可扩展的认证与访问控制模块。 + +6. Hooks and Plugins: 系统每层提供可扩展的钩子,支持插件方式扩展服务器。 + +------------- +Network Layer +------------- + +连接层处理服务端Socket连接与MQTT协议编解码: + +1. 基于 `eSockd`_ 框架的异步TCP服务端 +2. TCP Acceptor池与异步TCP Accept +3. TCP/SSL, WebSocket/SSL连接支持 +4. 最大并发连接数限制 +5. 基于IP地址(CIDR)访问控制 +6. 基于Leaky Bucket的流控 +7. MQTT协议编解码 +8. MQTT协议心跳检测 +9. MQTT协议报文处理 + +* General Non-blocking TCP/SSL Socket Server +* Acceptor Pool and Asynchronous TCP Accept +* Parameterized Connection Module +* Max connections management +* Allow/Deny by peer address or CIDR +* Keepalive Support +* Rate Limit by Leaky Bucket +The_Leaky_Bucket_Algorithm + +------------- +Session Layer +------------- + +会话层处理MQTT协议发布订阅(Publish/Subscribe)业务交互流程: + +1. 缓存MQTT客户端的全部订阅(Subscription),并终结订阅QoS + +2. 处理Qos0/1/2消息接收与下发,消息超时重传与离线消息保存 + +3. 飞行窗口(Inflight Window),下发消息吞吐控制与顺序保证 + +4. 保存服务器发送到客户端的,已发送未确认的Qos1/2消息 + +5. 缓存客户端发送到服务端,未接收到PUBREL的QoS2消息 + +6. 客户端离线时,保存持久会话的离线Qos1/2消息 + +%% @doc Session for persistent MQTT client. +%% +%% Session State in the broker consists of: +%% +%% 1. The Client’s subscriptions. +%% +%% 2. inflight qos1/2 messages sent to the client but unacked, QoS 1 and QoS 2 +%% messages which 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 +%% messages which have been received from the Client, but have not been +%% completely acknowledged. +%% +%% 4. all qos1, qos2 messages published to when client is disconnected. +%% QoS 1 and QoS 2 messages pending transmission to the Client. +%% +%% 5. Optionally, QoS 0 messages pending transmission to the Client. +%% +%% State of Message: newcome, inflight, pending + + +MQueue and Inflight Window +--------------------------- + +%% Concept of Message Queue and Inflight Window: +%% +%% |<----------------- Max Len ----------------->| +%% ----------------------------------------------- +%% IN -> | Messages Queue | Inflight Window | -> Out +%% ----------------------------------------------- +%% |<--- Win Size --->| +%% +%% +%% 1. Inflight Window to store the messages delivered and awaiting for puback. +%% +%% 2. Enqueue messages when the inflight window is full. +%% +%% 3. If the queue is full, dropped qos0 messages if store_qos0 is true, +%% otherwise dropped the oldest one. + +会话层通过一个内存消息队列和飞行窗口处理下发消息:: + + |<----------------- Max Len ----------------->| + ----------------------------------------------- + IN -> | Messages Queue | Inflight Window | -> Out + ----------------------------------------------- + |<--- Win Size --->| + +飞行窗口(Inflight Window)保存当前正在发送未确认的Qos1/2消息。窗口值越大,吞吐越高;窗口值越小,消息顺序越严格。 + +当客户端离线或者飞行窗口(Inflight Window)满时,消息缓存到队列。如果消息队列满,先丢弃Qos0消息或最早进入队列的消息。 + +PacketId and MessageId +---------------------- + + +MQTT协议定义了一个16bits的报文ID(PacketId),用于客户端到服务器的报文收发与确认。MQTT发布报文(PUBLISH)进入消息服务器后,转换为一个消息对象并分配128bits消息ID(MessageId)。 + +The 128bits global unique messsage id:: + + -------------------------------------------------------- + | Timestamp | NodeID + PID | Sequence | + |<------- 64bits ------->|<--- 48bits --->|<- 16bits ->| + -------------------------------------------------------- + + 1. Timestamp: erlang:system_time if Erlang >= R18, otherwise os:timestamp + 2. NodeId: encode node() to 2 bytes integer + 3. Pid: encode pid to 4 bytes integer + 4. Sequence: 2 bytes sequence in one process + + +端到端消息发布订阅(Pub/Sub)过程中,发布报文ID与报文QoS终结在会话层,由唯一ID标识的MQTT消息对象在节点间路由:: + + PktId <-- Session --> MsgId <-- Router --> MsgId <-- Session --> PktId + +------------ +PubSub Layer +------------ + +The PubSub layer would maintain a subscription table and publish MQTT messages to subscribers. + +.. image:: _static/images/dispatch.png + +MQTT messages will be dispatched to the subscriber's session, and finally be delivered to the client. + +----------- +Route Layer +----------- + +The route layer would maintain and replicate the global Topic Trie and Routing Table. The topic tire is composed of wildcard topics created by subscribers, and the Routing Table map a topic to nodes in the cluster. + +For example, if node1 subscribed 't/+/x' and 't/+/y', node2 subscribed 't/#' and node3 subscribed 't/a', there will be a topic trie and route table:: + + ------------------------- + | t | + | / \ | + | + # | + | / \ | + | x y | + ------------------------- + | t/+/x -> node1, node3 | + | t/+/y -> node1 | + | t/# -> node2 | + | t/a -> node3 | + ------------------------- + +The route layer would route MQTT messages between nodes in a cluster by topic trie match and routing table lookup. + +.. image:: _static/images/route.png + +## Cluster Design + +1. One 'disc_copies' node and many 'ram_copies' nodes. + + 2. Topic trie tree will be copied to every clusterd node. + + 3. Subscribers to topic will be stored in each node and will not be copied. + + ## Cluster Strategy + + TODO:... + + 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. + + 2. As soon as a client on a node subscribes to a topic it becomes known within the cluster. If one of the clients somewhere in the cluster is publishing to this topic, the message will be delivered to its subscriber no matter to which cluster node it is connected. + + +.. _design_auth_acl: + +---------------------- +Authentication and ACL +---------------------- + +emqttd消息服务器支持可扩展的认证与访问控制,由emqttd_access_control、emqttd_auth_mod和emqttd_acl_mod模块实现。 + +emqttd_access_control模块提供了注册认证扩展接口:: + + register_mod(auth | acl, atom(), list()) -> ok | {error, any()}. + + register_mod(auth | acl, atom(), list(), non_neg_integer()) -> ok | {error, any()}. + +Authentication Bahavihour +------------------------- + +emqttd_auth_mod定义认证扩展模块Behavihour:: + + -module(emqttd_auth_mod). + + -ifdef(use_specs). + + -callback init(AuthOpts :: list()) -> {ok, State :: any()}. + + -callback check(Client, Password, State) -> ok | ignore | {error, string()} when + Client :: mqtt_client(), + Password :: binary(), + State :: any(). + + -callback description() -> string(). + + -else. + + -export([behaviour_info/1]). + + behaviour_info(callbacks) -> + [{init, 1}, {check, 3}, {description, 0}]; + behaviour_info(_Other) -> + undefined. + + -endif. + +emqttd消息服务器自身实现的认证模块包括: + ++-----------------------+--------------------------------+ +| 模块 | 认证方式 | ++-----------------------+--------------------------------+ +| emqttd_auth_username | 用户名密码认证 | ++-----------------------+--------------------------------+ +| emqttd_auth_clientid | ClientID认证 | ++-----------------------+--------------------------------+ +| emqttd_auth_ldap | LDAP认证 | ++-----------------------+--------------------------------+ +| emqttd_auth_anonymous | 匿名认证 | ++-----------------------+--------------------------------+ + +Authorization(ACL) +------------------ + +emqttd_acl_mod模块定义访问控制Behavihour:: + + -module(emqttd_acl_mod). + + -include("emqttd.hrl"). + + -ifdef(use_specs). + + -callback init(AclOpts :: list()) -> {ok, State :: any()}. + + -callback check_acl({Client, PubSub, Topic}, State :: any()) -> allow | deny | ignore when + Client :: mqtt_client(), + PubSub :: pubsub(), + Topic :: binary(). + + -callback reload_acl(State :: any()) -> ok | {error, any()}. + + -callback description() -> string(). + + -else. + + -export([behaviour_info/1]). + + behaviour_info(callbacks) -> + [{init, 1}, {check_acl, 2}, {reload_acl, 1}, {description, 0}]; + behaviour_info(_Other) -> + undefined. + + -endif. + +emqttd_acl_internal模块实现缺省的基于etc/acl.config文件的访问控制:: + + %%%----------------------------------------------------------------------------- + %%% + %%% -type who() :: all | binary() | + %%% {ipaddr, esockd_access:cidr()} | + %%% {client, binary()} | + %%% {user, binary()}. + %%% + %%% -type access() :: subscribe | publish | pubsub. + %%% + %%% -type topic() :: binary(). + %%% + %%% -type rule() :: {allow, all} | + %%% {allow, who(), access(), list(topic())} | + %%% {deny, all} | + %%% {deny, who(), access(), list(topic())}. + %%% + %%%----------------------------------------------------------------------------- + + {allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}. + + {allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}. + + {deny, all, subscribe, ["$SYS/#", {eq, "#"}]}. + + {allow, all}. + +.. _design_hook: + +------------ +Hooks Design +------------ + +What's Hook +----------- + +emqttd消息服务器在客户端上下线、主题订阅、消息收发位置设计了扩展钩子(Hook): + ++------------------------+----------------------------------+ +| 钩子 | 说明 | ++========================+==================================+ +| client.connected | 客户端上线 | ++------------------------+----------------------------------+ +| client.subscribe | 客户端订阅主题前 | ++------------------------+----------------------------------+ +| client.subscribe.after | 客户端订阅主题后 | ++------------------------+----------------------------------+ +| client.unsubscribe | 客户端取消订阅主题 | ++------------------------+----------------------------------+ +| message.publish | MQTT消息发布 | ++------------------------+----------------------------------+ +| message.delivered | MQTT消息送达 | ++------------------------+----------------------------------+ +| message.acked | MQTT消息回执 | ++------------------------+----------------------------------+ +| client.disconnected | 客户端连接断开 | ++------------------------+----------------------------------+ + +钩子(Hook)采用职责链设计模式(`Chain-of-responsibility_pattern`_),扩展模块或插件向钩子注册回调函数,系统在客户端上下线、主题订阅或消息发布确认时,触发钩子顺序执行回调函数:: + + -------- ok | {ok, NewAcc} -------- ok | {ok, NewAcc} -------- + (Args, Acc) --> | Fun1 | -------------------> | Fun2 | -------------------> | Fun3 | --> {ok, Acc} | {stop, Acc} + -------- -------- -------- + | | | + stop | {stop, NewAcc} stop | {stop, NewAcc} stop | {stop, NewAcc} + +不同钩子的回调函数输入参数不同,用户可参考插件模版的 `emqttd_plugin_template`_ 模块,每个回调函数应该返回: + ++-----------------+------------------------+ +| 返回 | 说明 | ++=================+========================+ +| ok | 继续执行 | ++-----------------+------------------------+ +| {ok, NewAcc} | 返回累积参数继续执行 | ++-----------------+------------------------+ +| stop | 停止执行 | ++-----------------+------------------------+ +| {stop, NewAcc} | 返回累积参数停止执行 | ++-----------------+------------------------+ + +Hook Implementation +------------------- + +emqttd模块封装了Hook接口: + +.. code:: erlang + + -module(emqttd). + + %% Hooks API + -export([hook/4, hook/3, unhook/2, run_hooks/3]). + hook(Hook :: atom(), Callback :: function(), InitArgs :: list(any())) -> ok | {error, any()}. + + hook(Hook :: atom(), Callback :: function(), InitArgs :: list(any()), Priority :: integer()) -> ok | {error, any()}. + + unhook(Hook :: atom(), Callback :: function()) -> ok | {error, any()}. + + run_hooks(Hook :: atom(), Args :: list(any()), Acc :: any()) -> {ok | stop, any()}. + +emqttd_hook模块实现Hook机制: + +.. code:: erlang + + -module(emqttd_hook). + + %% Hooks API + -export([add/3, add/4, delete/2, run/3, lookup/1]). + + add(HookPoint :: atom(), Callback :: function(), InitArgs :: list(any())) -> ok. + + add(HookPoint :: atom(), Callback :: function(), InitArgs :: list(any()), Priority :: integer()) -> ok. + + delete(HookPoint :: atom(), Callback :: function()) -> ok. + + run(HookPoint :: atom(), Args :: list(any()), Acc :: any()) -> any(). + + lookup(HookPoint :: atom()) -> [#callback{}]. + +Use Hooks +--------- + +`emqttd_plugin_template`_ 提供了全部钩子的使用示例,例如端到端的消息处理回调: + +.. code:: erlang + + -module(emqttd_plugin_template). + + -export([load/1, unload/0]). + + -export([on_message_publish/2, on_message_delivered/3, on_message_acked/3]). + + load(Env) -> + emqttd:hook('message.publish', fun ?MODULE:on_message_publish/2, [Env]), + emqttd:hook('message.delivered', fun ?MODULE:on_message_delivered/3, [Env]), + emqttd:hook('message.acked', fun ?MODULE:on_message_acked/3, [Env]). + + on_message_publish(Message, _Env) -> + io:format("publish ~s~n", [emqttd_message:format(Message)]), + {ok, Message}. + + on_message_delivered(ClientId, Message, _Env) -> + io:format("delivered to client ~s: ~s~n", [ClientId, emqttd_message:format(Message)]), + {ok, Message}. + + on_message_acked(ClientId, Message, _Env) -> + io:format("client ~s acked: ~s~n", [ClientId, emqttd_message:format(Message)]), + {ok, Message}. + + unload() -> + emqttd:unhook('message.publish', fun ?MODULE:on_message_publish/2), + emqttd:unhook('message.acked', fun ?MODULE:on_message_acked/3), + emqttd:unhook('message.delivered', fun ?MODULE:on_message_delivered/3). + +.. _design_plugin: + +------------- +Plugin Design +------------- + +插件是一个普通的Erlang应用(Application),放置在emqttd/plugins目录可以被动态加载。插件主要通过钩子(Hook)机制扩展服务器功能,或通过注册扩展模块方式集成认证访问控制。 + +emqttd_plugins模块实现插件机制,提供加载卸载插件API:: + + -module(emqttd_plugins). + + -export([load/1, unload/1]). + + %% @doc Load a Plugin + load(PluginName :: atom()) -> ok | {error, any()}. + + %% @doc UnLoad a Plugin + unload(PluginName :: atom()) -> ok | {error, any()}. + +用户可通过'./bin/emqttd_ctl'命令行加载卸载插件:: + + ./bin/emqttd_ctl plugins load emqttd_plugin_redis + + ./bin/emqttd_ctl plugins unload emqttd_plugin_redis + +开发者请参考模版插件: http://github.com/emqtt/emqttd_plugin_template + +.. _design_erlang: + +---------- +Erlang/OTP +---------- + +1. Pool, Pool, Pool... Use the awesome GProc libary: https://github.com/uwiger/gproc + +2. 异步,异步,异步消息...连接层到路由层异步消息,同步请求用于负载保护 + +3. 避免进程Mailbox累积消息,负载高的进程可以使用gen_server2 + +4. 消息流经的Socket连接、会话进程必须Hibernate,主动回收binary句柄 + +5. 多使用Binary数据,避免进程间内存复制 + +6. 使用ETS, ETS, ETS...Message Passing Vs ETS + +7. 避免ETS表非键值字段select, match + +8. 避免大量数据ETS读写, 每次ETS读写会复制内存,可使用lookup_element, update_counter + +9. 适当开启ETS表{write_concurrency, true} + +10. 保护Mnesia数据库事务,尽量减少事务数量,避免事务过载(overload) + +11. 避免Mnesia数据表索引,和非键值字段match, select + --------------- Pubsub Sequence @@ -74,22 +649,6 @@ binary:split | 1.65243 Cluster Design -------------- -## Cluster Design - -1. One 'disc_copies' node and many 'ram_copies' nodes. - - 2. Topic trie tree will be copied to every clusterd node. - - 3. Subscribers to topic will be stored in each node and will not be copied. - - ## Cluster Strategy - - TODO:... - - 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. - - 2. As soon as a client on a node subscribes to a topic it becomes known within the cluster. If one of the clients somewhere in the cluster is publishing to this topic, the message will be delivered to its subscriber no matter to which cluster node it is connected. - .... ## Cluster Architecture @@ -219,10 +778,9 @@ hook(Hook, Name, MFA) -> The design is experimental. - --------------- +------------- Plugin Design --------------- +------------- ## Overview @@ -327,4 +885,8 @@ emqttd_plugins:unload() emqttd_plugins:unload(Name) ``` +.. _eSockd: https://github.com/emqtt/esockd +.. _Chain-of-responsibility_pattern: https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern +.. _emqttd_plugin_template: https://github.com/emqtt/emqttd_plugin_template/blob/master/src/emqttd_plugin_template.erl + From fd15099f74534fd364954c765e83dd6f5cfcb5d2 Mon Sep 17 00:00:00 2001 From: Feng Date: Sat, 2 Apr 2016 13:58:44 +0800 Subject: [PATCH 07/14] design doc --- docs/source/design.rst | 710 +++++++++-------------------------------- 1 file changed, 149 insertions(+), 561 deletions(-) diff --git a/docs/source/design.rst b/docs/source/design.rst index da6da0e28..452f775b0 100644 --- a/docs/source/design.rst +++ b/docs/source/design.rst @@ -5,65 +5,6 @@ Design Guide ============ -.. _design_intro: - ----------------- -About emqttd 1.0 ----------------- - -Finally, we decide to tag emqttd 1.0 after two years development. An experimental project that try to introcude MQTT protocol to SCADA system. - - -emqttd消息服务器1.0版本经过两年时间开发,开发方式有点像摇滚乐专辑的制作,最初从0.1版本一些即兴创作的部分开始,但最终在各层架构设计上做出了正确的选择,整体上体现了某种程度的正交(Orthogonality)和一致性(Consistency)。emqttd 1.0可能是目前开源领域唯一一个,几乎不需要用户做太多努力就可以支持到100万连接的MQTT服务器。 - -C1000K Problem --------------- - -多核服务器和现代操作系统内核层面,可以很轻松支持100万TCP连接,核心问题是应用层面如何处理业务瓶颈。 - -emqttd消息服务器在业务和应用层面,解决了承载100万连接的各类瓶颈问题。连接测试的操作系统内核、TCP协议栈、Erlang虚拟机参数: http://docs.emqtt.cn/zh_CN/latest/tune.html - -Fully Asynchronous ------------------- - -emqttd消息服务器是基于Erlang/OTP平台的全异步的架构:异步TCP连接处理、异步主题(Topic)订阅、异步消息发布。只有在资源负载限制部分采用同步设计,比如TCP连接创建和Mnesia数据库事务执行。 - -一条MQTT消息从发布者(Publisher)到订阅者(Subscriber),在emqttd消息服务器内部异步流过一系列Erlang进程Mailbox:: - - ---------- ----------- ---------- - Publisher --Msg-->| Client | --Msg--> | Session | --Msg--> | Client | --Msg--> Subscriber - ---------- ----------- ---------- - -Message Persistence? --------------------- - -emqttd1.0版本不支持服务器内部消息持久化,这是一个架构设计选择。首先,emqttd解决的核心问题是连接与路由;其次,我们认为内置持久化是个错误设计。 - -传统内置消息持久化的MQ服务器,比如广泛使用的JMS服务器ActiveMQ,几乎每个大版本都在重新设计持久化部分。内置消息持久化在设计上有两个问题: - -1. 如何平衡内存与磁盘使用?消息路由基于内存,消息存储是基于磁盘。 - -2. 多服务器分布集群架构下,如何放置Queue?如何复制Queue的消息? - -Kafka在上述问题上,做出了正确的设计:一个完全基于磁盘分布式commit log的消息服务器。 - -emqttd2.0版本计划通过外部存储,例如Redis、Kafka、Cassandra、PostgreSQL,实现多种方式的消息持久化。 - -设计上分离消息路由与消息存储职责后,数据复制容灾备份甚至应用集成,可以在数据层面灵活实现。 - -NetSplit Problem ----------------- - -The emqttd broker cluster requires reliable network to avoid NetSplit. - -emqttd1.0消息服务器集群,基于Mnesia数据库设计。NetSplit发生时,节点间状态是:Erlang节点间可以连通,互相询问自己是否宕机,对方回答你已经宕机:( - -NetSplit故障发生时,emqttd消息服务器的log/emqttd_error.log日志,会打印critical级别日志:: - - Mnesia inconsistent_database event: running_partitioned_network, emqttd@host - -emqttd集群部署在同一IDC网络下,NetSplit发生的几率很低,一旦发生又很难自动处理。所以emqttd1.0版本设计选择是,集群不自动化处理NetSplit,需要人工重启部分节点。 - .. _design_architecture: ------------ @@ -73,154 +14,144 @@ Architecture Concept Model ------------- -emqttd消息服务器概念上更像一台网络路由器(Router)或交换机(Switch),而不是传统的企业级消息服务器(MQ)。相比网络路由器按IP地址或MPLS标签路由报文,emqttd按主题树(Topic Trie)发布订阅模式在集群节点间路由MQTT消息: +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 -Design Principle ----------------- +Design Philosophy +----------------- -1. emqttd消息服务器核心解决的问题:处理海量的并发MQTT连接与路由消息。 +1. Focus on handling millions of MQTT connections and route MQTT messages between clustered nodes. -2. 充分利用Erlang/OTP平台软实时、低延时、高并发、分布容错的优势。 +2. Embrace Erlang/OTP, The Soft-Realtime, Low-Latency, Concurrent and Fault-Tolerant platform. -3. 连接(Connection)、会话(Session)、路由(Router)、集群(Cluster)分层。 +3. Connection, Session, PubSub, Router and Distributed Layers. -4. 消息路由平面(Flow Plane)与控制管理平面(Control Plane)分离。 +4. Seperate the Message Flow Plane and Control/Management Plane. -5. 支持后端数据库或NoSQL实现数据持久化、容灾备份与应用集成。 +5. Stream out the MQTT messages to various backends. System Layers ------------- -1. Network Layer: 负责TCP连接处理、MQTT协议编解码。 +.. code:: -2. Session Layer: 处理MQTT协议发布订阅消息交互流程。 + -------------- ----------- ---------- ---------- + Client --> | Connection | --> | Session | --> | PubSub | --> | Router | + -------------- ----------- ---------- ---------- + +1. Connection Layer: -3. PubSub Layer: 节点内路由派发MQTT消息。 + Handle TCP and WebSocket connections, encode/decode MQTT packets. + +2. Session Layer: -4. Route Layer: 分布节点间路由MQTT消息。 + Process MQTT PUBLISH/SUBSCRIBE Packets recevied from client, and deliver MQTT messages to client. -5. Authentication and ACL: 连接层支持可扩展的认证与访问控制模块。 +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 -6. Hooks and Plugins: 系统每层提供可扩展的钩子,支持插件方式扩展服务器。 +---------------- +Connection Layer +---------------- -------------- -Network Layer -------------- +This layer is built on the `eSockd`_ library which is a general Non-blocking TCP/SSL Socket Server: -连接层处理服务端Socket连接与MQTT协议编解码: - -1. 基于 `eSockd`_ 框架的异步TCP服务端 -2. TCP Acceptor池与异步TCP Accept -3. TCP/SSL, WebSocket/SSL连接支持 -4. 最大并发连接数限制 -5. 基于IP地址(CIDR)访问控制 -6. 基于Leaky Bucket的流控 -7. MQTT协议编解码 -8. MQTT协议心跳检测 -9. MQTT协议报文处理 - -* General Non-blocking TCP/SSL Socket Server * Acceptor Pool and Asynchronous TCP Accept * Parameterized Connection Module * Max connections management * Allow/Deny by peer address or CIDR * Keepalive Support -* Rate Limit by Leaky Bucket -The_Leaky_Bucket_Algorithm +* Rate Limit based on The Leaky Bucket Algorithm +* Fully Asynchronous TCP RECV/SEND + +This layer is also responsible for encoding/decoding MQTT frames: + +1. Parse MQTT frames received from client +2. Serialize MQTT frames sent to client +3. MQTT Connection Keepalive + +Main modules of this layer: + ++------------------+--------------------------+ +| Module | Description | ++==================+==========================+ +| emqttd_client | TCP Client | ++------------------+--------------------------+ +| emqttd_ws_client | WebSocket Client | ++------------------+--------------------------+ +| emqttd_protocol | MQTT Protocol Handler | ++------------------+--------------------------+ +| emqttd_parser | MQTT Frame Parser | ++------------------+--------------------------+ +| emqttd_serializer| MQTT Frame Serializer | ++------------------+--------------------------+ ------------- Session Layer ------------- -会话层处理MQTT协议发布订阅(Publish/Subscribe)业务交互流程: +The session layer processes MQTT PUBLISH/SUBSCRIBE packets received from client, and deliver PUBLISH packets to client. -1. 缓存MQTT客户端的全部订阅(Subscription),并终结订阅QoS +A MQTT session will store the subscriptions and inflight messages in memory: -2. 处理Qos0/1/2消息接收与下发,消息超时重传与离线消息保存 +1. The Client’s subscriptions. -3. 飞行窗口(Inflight Window),下发消息吞吐控制与顺序保证 +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. -4. 保存服务器发送到客户端的,已发送未确认的Qos1/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 + completely acknowledged. -5. 缓存客户端发送到服务端,未接收到PUBREL的QoS2消息 - -6. 客户端离线时,保存持久会话的离线Qos1/2消息 - -%% @doc Session for persistent MQTT client. -%% -%% Session State in the broker consists of: -%% -%% 1. The Client’s subscriptions. -%% -%% 2. inflight qos1/2 messages sent to the client but unacked, QoS 1 and QoS 2 -%% messages which 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 -%% messages which have been received from the Client, but have not been -%% completely acknowledged. -%% -%% 4. all qos1, qos2 messages published to when client is disconnected. -%% QoS 1 and QoS 2 messages pending transmission to the Client. -%% -%% 5. Optionally, QoS 0 messages pending transmission to the Client. -%% -%% State of Message: newcome, inflight, pending +4. All qos1, qos2 messages published to when client has been disconnected. +Main module of this layer is emqttd_session. MQueue and Inflight Window ---------------------------- +-------------------------- -%% Concept of Message Queue and Inflight Window: -%% -%% |<----------------- Max Len ----------------->| -%% ----------------------------------------------- -%% IN -> | Messages Queue | Inflight Window | -> Out -%% ----------------------------------------------- -%% |<--- Win Size --->| -%% -%% -%% 1. Inflight Window to store the messages delivered and awaiting for puback. -%% -%% 2. Enqueue messages when the inflight window is full. -%% -%% 3. If the queue is full, dropped qos0 messages if store_qos0 is true, -%% otherwise dropped the oldest one. +Concept of Message Queue and Inflight Window:: -会话层通过一个内存消息队列和飞行窗口处理下发消息:: + |<----------------- Max Len ----------------->| + ----------------------------------------------- +IN -> | Messages Queue | Inflight Window | -> Out + ----------------------------------------------- + |<--- Win Size --->| - |<----------------- Max Len ----------------->| - ----------------------------------------------- - IN -> | Messages Queue | Inflight Window | -> Out - ----------------------------------------------- - |<--- Win Size --->| +1. Inflight Window to store the messages delivered and awaiting for puback. -飞行窗口(Inflight Window)保存当前正在发送未确认的Qos1/2消息。窗口值越大,吞吐越高;窗口值越小,消息顺序越严格。 +2. Enqueue messages when the inflight window is full. -当客户端离线或者飞行窗口(Inflight Window)满时,消息缓存到队列。如果消息队列满,先丢弃Qos0消息或最早进入队列的消息。 +3. If the queue is full, dropped qos0 messages if store_qos0 is true, + otherwise dropped the oldest one. + +The larger the inflight window size, the higher the throughput. The smaller the window size, the more strict the message order. 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. -MQTT协议定义了一个16bits的报文ID(PacketId),用于客户端到服务器的报文收发与确认。MQTT发布报文(PUBLISH)进入消息服务器后,转换为一个消息对象并分配128bits消息ID(MessageId)。 +Format of the global unique messsage id:: -The 128bits global unique messsage id:: - - -------------------------------------------------------- - | Timestamp | NodeID + PID | Sequence | + +------------------------+----------------+------------+ + | Timestamp | NodeID + PID | Sequence | + +------------------------+----------------+------------+ |<------- 64bits ------->|<--- 48bits --->|<- 16bits ->| - -------------------------------------------------------- + +------------------------+----------------+------------+ 1. Timestamp: erlang:system_time if Erlang >= R18, otherwise os:timestamp 2. NodeId: encode node() to 2 bytes integer 3. Pid: encode pid to 4 bytes integer 4. Sequence: 2 bytes sequence in one process - -端到端消息发布订阅(Pub/Sub)过程中,发布报文ID与报文QoS终结在会话层,由唯一ID标识的MQTT消息对象在节点间路由:: +The PacketId and MessageId in a End-to-End Message PubSub Sequence:: PktId <-- Session --> MsgId <-- Router --> MsgId <-- Session --> PktId @@ -228,17 +159,17 @@ The 128bits global unique messsage id:: PubSub Layer ------------ -The PubSub layer would maintain a subscription table and publish MQTT messages to subscribers. +The PubSub layer maintains a subscription table and responsible to dispatch MQTT messages to subscribers. .. image:: _static/images/dispatch.png -MQTT messages will be dispatched to the subscriber's session, and finally be delivered to the client. +MQTT messages will be dispatched to the subscriber's session, which finally delivers the message to client. ------------ -Route Layer ------------ +------------- +Routing Layer +------------- -The route layer would maintain and replicate the global Topic Trie and Routing Table. The topic tire is composed of wildcard topics created by subscribers, and the Routing Table map a topic to nodes in the cluster. +The routing(distributed) layer maintains and replicates the global Topic Trie and Routing Table. The topic tire is composed of wildcard topics created by subscribers, and the Routing Table map a topic to nodes in the cluster. For example, if node1 subscribed 't/+/x' and 't/+/y', node2 subscribed 't/#' and node3 subscribed 't/a', there will be a topic trie and route table:: @@ -255,26 +186,11 @@ For example, if node1 subscribed 't/+/x' and 't/+/y', node2 subscribed 't/#' and | t/a -> node3 | ------------------------- -The route layer would route MQTT messages between nodes in a cluster by topic trie match and routing table lookup. +The routing layer would route MQTT messages between clustered nodes by topic trie match and routing table lookup, and follow the ruels below: -.. image:: _static/images/route.png - -## Cluster Design - -1. One 'disc_copies' node and many 'ram_copies' nodes. - - 2. Topic trie tree will be copied to every clusterd node. - - 3. Subscribers to topic will be stored in each node and will not be copied. - - ## Cluster Strategy - - TODO:... - - 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. - - 2. As soon as a client on a node subscribes to a topic it becomes known within the cluster. If one of the clients somewhere in the cluster is publishing to this topic, the message will be delivered to its subscriber no matter to which cluster node it is connected. +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. +2. As soon as a client on a node subscribes to a topic it becomes known within the cluster. If one of the clients somewhere in the cluster is publishing to this topic, the message will be delivered to its subscriber no matter to which cluster node it is connected. .. _design_auth_acl: @@ -282,9 +198,9 @@ The route layer would route MQTT messages between nodes in a cluster by topic tr Authentication and ACL ---------------------- -emqttd消息服务器支持可扩展的认证与访问控制,由emqttd_access_control、emqttd_auth_mod和emqttd_acl_mod模块实现。 +The emqttd broker supports an extensible authentication/ACL mechanism, which is implemented by emqttd_access_control, emqttd_auth_mod and emqttd_acl_mod modules. -emqttd_access_control模块提供了注册认证扩展接口:: +emqttd_access_control module provides two APIs that help register/unregister auth or ACL module:: register_mod(auth | acl, atom(), list()) -> ok | {error, any()}. @@ -293,7 +209,7 @@ emqttd_access_control模块提供了注册认证扩展接口:: Authentication Bahavihour ------------------------- -emqttd_auth_mod定义认证扩展模块Behavihour:: +The emqttd_auth_mod defines an Erlang behavihour for authentication module:: -module(emqttd_auth_mod). @@ -319,24 +235,24 @@ emqttd_auth_mod定义认证扩展模块Behavihour:: -endif. -emqttd消息服务器自身实现的认证模块包括: +The authentication modules implemented by default: +-----------------------+--------------------------------+ -| 模块 | 认证方式 | +| Module | Authentication | +-----------------------+--------------------------------+ -| emqttd_auth_username | 用户名密码认证 | +| emqttd_auth_username | Username and Password | +-----------------------+--------------------------------+ -| emqttd_auth_clientid | ClientID认证 | +| emqttd_auth_clientid | ClientID | +-----------------------+--------------------------------+ -| emqttd_auth_ldap | LDAP认证 | +| emqttd_auth_ldap | LDAP | +-----------------------+--------------------------------+ -| emqttd_auth_anonymous | 匿名认证 | +| emqttd_auth_anonymous | Anonymous | +-----------------------+--------------------------------+ Authorization(ACL) ------------------ -emqttd_acl_mod模块定义访问控制Behavihour:: +The emqttd_acl_mod defines an Erlang behavihour for ACL module:: -module(emqttd_acl_mod). @@ -366,7 +282,7 @@ emqttd_acl_mod模块定义访问控制Behavihour:: -endif. -emqttd_acl_internal模块实现缺省的基于etc/acl.config文件的访问控制:: +emqttd_acl_internal implements the default ACL based on etc/acl.config file:: %%%----------------------------------------------------------------------------- %%% @@ -400,32 +316,31 @@ emqttd_acl_internal模块实现缺省的基于etc/acl.config文件的访问控 Hooks Design ------------ -What's Hook ------------ +The emqttd broker implements a simple but powerful hooks mechanism to help users develop plugin. The broker would run the hooks when a client is connected/disconnected, a topic is subscribed/unsubscribed or a MQTT message is published/delivered/acked: -emqttd消息服务器在客户端上下线、主题订阅、消息收发位置设计了扩展钩子(Hook): +Hooks defined by the emqttd 1.0 broker: -+------------------------+----------------------------------+ -| 钩子 | 说明 | -+========================+==================================+ -| client.connected | 客户端上线 | -+------------------------+----------------------------------+ -| client.subscribe | 客户端订阅主题前 | -+------------------------+----------------------------------+ -| client.subscribe.after | 客户端订阅主题后 | -+------------------------+----------------------------------+ -| client.unsubscribe | 客户端取消订阅主题 | -+------------------------+----------------------------------+ -| message.publish | MQTT消息发布 | -+------------------------+----------------------------------+ -| message.delivered | MQTT消息送达 | -+------------------------+----------------------------------+ -| message.acked | MQTT消息回执 | -+------------------------+----------------------------------+ -| client.disconnected | 客户端连接断开 | -+------------------------+----------------------------------+ ++------------------------+------------------------------------------------------+ +| Hook | Description | ++========================+======================================================+ +| client.connected | Run when client connected to the broker successfully | ++------------------------+------------------------------------------------------+ +| client.subscribe | Run before client subscribes topics | ++------------------------+------------------------------------------------------+ +| client.subscribe.after | Run After client subscribed topics | ++------------------------+------------------------------------------------------+ +| client.unsubscribe | Run when client unsubscribes topics | ++------------------------+------------------------------------------------------+ +| message.publish | Run when a MQTT message is published | ++------------------------+------------------------------------------------------+ +| message.delivered | Run when a MQTT message is delivered | ++------------------------+------------------------------------------------------+ +| message.acked | Run when a MQTT message is acked | ++------------------------+------------------------------------------------------+ +| client.disconnected | Run when client disconnnected from broker | ++------------------------+------------------------------------------------------+ -钩子(Hook)采用职责链设计模式(`Chain-of-responsibility_pattern`_),扩展模块或插件向钩子注册回调函数,系统在客户端上下线、主题订阅或消息发布确认时,触发钩子顺序执行回调函数:: +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:: -------- ok | {ok, NewAcc} -------- ok | {ok, NewAcc} -------- (Args, Acc) --> | Fun1 | -------------------> | Fun2 | -------------------> | Fun3 | --> {ok, Acc} | {stop, Acc} @@ -433,24 +348,26 @@ emqttd消息服务器在客户端上下线、主题订阅、消息收发位置 | | | stop | {stop, NewAcc} stop | {stop, NewAcc} stop | {stop, NewAcc} -不同钩子的回调函数输入参数不同,用户可参考插件模版的 `emqttd_plugin_template`_ 模块,每个回调函数应该返回: +The callback function for hook should return: +-----------------+------------------------+ -| 返回 | 说明 | +| Return | Description | +=================+========================+ -| ok | 继续执行 | +| ok | Continue | +-----------------+------------------------+ -| {ok, NewAcc} | 返回累积参数继续执行 | +| {ok, NewAcc} | Return Acc and Continue| +-----------------+------------------------+ -| stop | 停止执行 | +| stop | Break | +-----------------+------------------------+ -| {stop, NewAcc} | 返回累积参数停止执行 | +| {stop, NewAcc} | Return Acc and Break | +-----------------+------------------------+ +The input arguments for a callback function is different depending on the type of hook. Clone the `emqttd_plugin_template`_ to check how to use hooks. + Hook Implementation ------------------- -emqttd模块封装了Hook接口: +The hook APIs defined in emqttd module: .. code:: erlang @@ -466,7 +383,7 @@ emqttd模块封装了Hook接口: run_hooks(Hook :: atom(), Args :: list(any()), Acc :: any()) -> {ok | stop, any()}. -emqttd_hook模块实现Hook机制: +And implemented in emqttd_hook module: .. code:: erlang @@ -485,10 +402,10 @@ emqttd_hook模块实现Hook机制: lookup(HookPoint :: atom()) -> [#callback{}]. -Use Hooks ---------- +Hook Usage +---------- -`emqttd_plugin_template`_ 提供了全部钩子的使用示例,例如端到端的消息处理回调: +`emqttd_plugin_template`_ provides the examples for hook usage: .. code:: erlang @@ -526,9 +443,12 @@ Use Hooks Plugin Design ------------- -插件是一个普通的Erlang应用(Application),放置在emqttd/plugins目录可以被动态加载。插件主要通过钩子(Hook)机制扩展服务器功能,或通过注册扩展模块方式集成认证访问控制。 +Plugin is a normal erlang application that could be started/stopped dynamically by a running emqttd broker. -emqttd_plugins模块实现插件机制,提供加载卸载插件API:: +emqttd_plugins Module +--------------------- + +The plugin mechanism is implemented by emqttd_plugins module:: -module(emqttd_plugins). @@ -540,353 +460,21 @@ emqttd_plugins模块实现插件机制,提供加载卸载插件API:: %% @doc UnLoad a Plugin unload(PluginName :: atom()) -> ok | {error, any()}. -用户可通过'./bin/emqttd_ctl'命令行加载卸载插件:: +Load a Plugin +------------- + +Use './bin/emqttd_ctl' CLI to load/unload a plugin:: ./bin/emqttd_ctl plugins load emqttd_plugin_redis ./bin/emqttd_ctl plugins unload emqttd_plugin_redis -开发者请参考模版插件: http://github.com/emqtt/emqttd_plugin_template - -.. _design_erlang: - ----------- -Erlang/OTP ----------- - -1. Pool, Pool, Pool... Use the awesome GProc libary: https://github.com/uwiger/gproc - -2. 异步,异步,异步消息...连接层到路由层异步消息,同步请求用于负载保护 - -3. 避免进程Mailbox累积消息,负载高的进程可以使用gen_server2 - -4. 消息流经的Socket连接、会话进程必须Hibernate,主动回收binary句柄 - -5. 多使用Binary数据,避免进程间内存复制 - -6. 使用ETS, ETS, ETS...Message Passing Vs ETS - -7. 避免ETS表非键值字段select, match - -8. 避免大量数据ETS读写, 每次ETS读写会复制内存,可使用lookup_element, update_counter - -9. 适当开启ETS表{write_concurrency, true} - -10. 保护Mnesia数据库事务,尽量减少事务数量,避免事务过载(overload) - -11. 避免Mnesia数据表索引,和非键值字段match, select - - ---------------- -Pubsub Sequence +Plugin Template --------------- -## PubSub Sequence - -### Clean Session = 1 - -``` - -title PubSub Sequence(Clean Session = 1) - -ClientA-->PubSub: Publish Message -PubSub-->ClientB: Dispatch Message -``` - -![PubSub_CleanSess_1](http://emqtt.io/static/img/design/PubSub_CleanSess_1.png) - -### Clean Session = 0 - -``` -title PubSub Sequence(Clean Session = 0) - -ClientA-->SessionA: Publish Message -SessionA-->PubSub: Publish Message -PubSub-->SessionB: Dispatch Message -SessionB-->ClientB: Dispatch Message - -``` -![PubSub_CleanSess_0](http://emqtt.io/static/img/design/PubSub_CleanSess_0.png) - - -## Qos - -PubQos | SubQos | In Message | Out Message --------|--------|------------|------------- -0 | 0 | 0 | 0 -0 | 1 | 0 | 0 -0 | 2 | 0 | 0 -1 | 0 | 1 | 0 -1 | 1 | 1 | 1 -1 | 2 | 1 | 1 -2 | 0 | 2 | 0 -2 | 1 | 2 | 1 -2 | 2 | 2 | 2 - - -## Topic Functions Benchmark - -Mac Air(11): - -Function | Time(microseconds) --------------|-------------------- -match | 6.25086 -triples | 13.86881 -words | 3.41177 -binary:split | 3.03776 - -iMac: - -Function | Time(microseconds) --------------|-------------------- -match | 3.2348 -triples | 6.93524 -words | 1.89616 -binary:split | 1.65243 - - --------------- -Cluster Design --------------- - - .... - -## Cluster Architecture - -![Cluster Design](http://emqtt.io/static/img/Cluster.png) -## Cluster Command - -```sh -./bin/emqttd_ctl cluster DiscNode -``` - -## Mnesia Example - -``` -(emqttd3@127.0.0.1)3> mnesia:info(). ----> Processes holding locks <--- ----> Processes waiting for locks <--- ----> Participant transactions <--- ----> Coordinator transactions <--- ----> Uncertain transactions <--- ----> Active tables <--- -mqtt_retained : with 6 records occupying 221 words of mem -topic_subscriber: with 0 records occupying 305 words of mem -topic_trie_node: with 129 records occupying 3195 words of mem -topic_trie : with 128 records occupying 3986 words of mem -topic : with 93 records occupying 1797 words of mem -schema : with 6 records occupying 1081 words of mem -===> System info in version "4.12.4", debug level = none <=== -opt_disc. Directory "/Users/erylee/Projects/emqttd/rel/emqttd3/data/mnesia" is NOT used. -use fallback at restart = false -running db nodes = ['emqttd2@127.0.0.1','emqttd@127.0.0.1','emqttd3@127.0.0.1'] -stopped db nodes = [] -master node tables = [] -remote = [] -ram_copies = [mqtt_retained,schema,topic,topic_subscriber,topic_trie, -topic_trie_node] -disc_copies = [] -disc_only_copies = [] -[{'emqttd2@127.0.0.1',ram_copies}, -{'emqttd3@127.0.0.1',ram_copies}, -{'emqttd@127.0.0.1',disc_copies}] = [schema] -[{'emqttd2@127.0.0.1',ram_copies}, -{'emqttd3@127.0.0.1',ram_copies}, -{'emqttd@127.0.0.1',ram_copies}] = [topic,topic_trie,topic_trie_node, -mqtt_retained] -[{'emqttd3@127.0.0.1',ram_copies}] = [topic_subscriber] -44 transactions committed, 5 aborted, 0 restarted, 0 logged to disc - 0 held locks, 0 in queue; 0 local transactions, 0 remote - 0 transactions waits for other nodes: [] - ``` - - ## Cluster vs Bridge - - Cluster will copy topic trie tree between nodes, Bridge will not. - - - -------------- -Hooks Design -------------- - -## Overview - -emqttd supported a simple hooks mechanism in 0.8.0 release to extend the broker. The designed is improved in 0.9.0 release. - -## API - -emqttd_broker Hook API: - -``` --export([hook/3, unhook/2, foreach_hooks/2, foldl_hooks/3]). -``` - -### Hook - -``` --spec hook(Hook :: atom(), Name :: any(), MFA :: mfa()) -> ok | {error, any()}. -hook(Hook, Name, MFA) -> - ... - ``` - - ### Unhook - - ``` - -spec unhook(Hook :: atom(), Name :: any()) -> ok | {error, any()}. - unhook(Hook, Name) -> - ... - ``` - - ### Foreach Hooks - - ``` - -spec foreach_hooks(Hook :: atom(), Args :: list()) -> any(). - foreach_hooks(Hook, Args) -> - ... - ``` - - ### Foldl Hooks - - ``` - -spec foldl_hooks(Hook :: atom(), Args :: list(), Acc0 :: any()) -> any(). - foldl_hooks(Hook, Args, Acc0) -> - ... - ``` - - ## Hooks - - Name | Type | Description - --------------- | ----------| -------------- - client.connected | foreach | Run when client connected successfully - client.subscribe | foldl | Run before client subscribe topics - client.subscribe.after | foreach | Run After client subscribe topics - client.unsubscribe | foldl | Run when client unsubscribe topics - message.publish | foldl | Run when message is published - message.acked | foreach | Run when message is acked - client.disconnected | foreach | Run when client is disconnnected - - ## End-to-End Message Pub/Ack - - Could use 'message.publish', 'message.acked' hooks to implement end-to-end message pub/ack: - - ``` - PktId <-- --> MsgId <-- --> MsgId <-- --> PktId - |<--- Qos --->|<---PubSub--->|<-- Qos -->| - ``` -## Limit - -The design is experimental. - -------------- -Plugin Design -------------- - -## Overview - -**Notice that 0.11.0 release use rebar to manage plugin's deps.** - -A plugin is just an erlang application that extends emqttd broker. - -The plugin application should be put in "emqttd/plugins/" folder to build. - - -## Plugin Project - -You could create a standalone plugin project outside emqttd, and then add it to "emqttd/plugins/" folder by "git submodule". - -Git submodule to compile emqttd_dashboard plugin with the broker, For example: - -``` -git submodule add https://github.com/emqtt/emqttd_dashboard.git plugins/emqttd_dashboard -make && make dist -``` - -## plugin.config - -**Each plugin should have a 'etc/plugin.config' file** - -For example, project structure of emqttd_dashboard plugin: - -``` -LICENSE -README.md -ebin -etc -priv -rebar.config -src -``` - -etc/plugin.config for emqttd_dashboard plugin: - -``` -[ -{emqttd_dashboard, [ -{listener, -{emqttd_dashboard, 18083, [ -{acceptors, 4}, -{max_clients, 512}]}} -]} -]. -``` - -## rebar.config - -**Plugin should use 'rebar.config' to manage depencies** - -emqttd_plugin_pgsql plugin's rebar.config, for example: - -``` -%% -*- erlang -*- - -{deps, [ -{epgsql, ".*",{git, "https://github.com/epgsql/epgsql.git", {branch, "master"}}} -]}. -``` - -## Build emqttd with plugins - -Put all the plugins you required in 'plugins/' folder of emqttd project, and then: - -``` -make && make dist -``` - -## Load Plugin - -'./bin/emqttd_ctl' to load/unload plugin, when emqttd broker started. - -``` -./bin/emqttd_ctl plugins load emqttd_plugin_demo - -./bin/emqttd_ctl plugins unload emqttd_plugin_demo -``` - -## List Plugins - -``` -./bin/emqttd_ctl plugins list -``` - -## API - -``` -%% Load all active plugins after broker started -emqttd_plugins:load() - -%% Load new plugin -emqttd_plugins:load(Name) - -%% Unload all active plugins before broker stopped -emqttd_plugins:unload() - -%% Unload a plugin -emqttd_plugins:unload(Name) -``` +http://github.com/emqtt/emqttd_plugin_template .. _eSockd: https://github.com/emqtt/esockd .. _Chain-of-responsibility_pattern: https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern .. _emqttd_plugin_template: https://github.com/emqtt/emqttd_plugin_template/blob/master/src/emqttd_plugin_template.erl - From c0cc696b526d34a2b45758902363728555ba48e3 Mon Sep 17 00:00:00 2001 From: Feng Date: Sat, 2 Apr 2016 14:26:28 +0800 Subject: [PATCH 08/14] spelling syntax --- docs/source/design.rst | 63 ++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/docs/source/design.rst b/docs/source/design.rst index 452f775b0..e59fbacc2 100644 --- a/docs/source/design.rst +++ b/docs/source/design.rst @@ -11,51 +11,44 @@ Design Guide Architecture ------------ -Concept Model -------------- - -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. +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. .. image:: _static/images/concept.png 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 ------------- +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:: -------------- ----------- ---------- ---------- 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 ---------------- @@ -96,7 +89,7 @@ Main modules of this 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: @@ -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 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 completely acknowledged. 4. All qos1, qos2 messages published to when client has been disconnected. -Main module of this layer is emqttd_session. - MQueue and Inflight Window -------------------------- @@ -124,7 +115,7 @@ IN -> | Messages Queue | Inflight Window | -> Out ----------------------------------------------- |<--- 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. @@ -136,9 +127,9 @@ The larger the inflight window size, the higher the throughput. The smaller the 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 | @@ -186,7 +177,7 @@ For example, if node1 subscribed 't/+/x' and 't/+/y', node2 subscribed 't/#' and | 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. @@ -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()}. -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). @@ -337,7 +328,7 @@ Hooks defined by the emqttd 1.0 broker: +------------------------+------------------------------------------------------+ | 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:: From d75d3719e10fbf88979d9705742dc6a41cc9474e Mon Sep 17 00:00:00 2001 From: Feng Date: Sat, 2 Apr 2016 14:40:54 +0800 Subject: [PATCH 09/14] add dispatch, route images --- docs/source/_static/images/dispatch.png | Bin 0 -> 10582 bytes docs/source/_static/images/route.png | Bin 21184 -> 19104 bytes docs/source/design.rst | 6 +++++- 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 docs/source/_static/images/dispatch.png diff --git a/docs/source/_static/images/dispatch.png b/docs/source/_static/images/dispatch.png new file mode 100644 index 0000000000000000000000000000000000000000..11d2c6567ec1054f275db26665ffa52da6c0616c GIT binary patch literal 10582 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 fFq&un@~V{8%ZFG^;Wxp&T_sS;ON|H@@j`RBc z?)(0&`+1)0kLuN>)A#!s$MIf=5LIOvTx>FIG&D3^Iax_{G_=c#XlR$Xu3m<}dD%fy zgN7z=DJS_*(|vj?-AhM9`_qM8R8^(A+{y^2ne7>CFXtmqhYxtS{yi;D5TU8U54K`)H$(fhnIj)=I#KLcA2rT$T4EewQ@s0rMf5oE1 zFaPbF#M)85ub!yxW&-NWy1Nv32w6 z6)GyK-bA+3uYvg0b~BGOG4p5MjlY4oc9`CMU zUAZDDBg1g_Zfx_14TrFwG4dfDeRfg`mUUOxpmILg{y;xDnI);G(mfr&6Qh1*j3HGhow z$FtKzVlpB@Q%T7efq`u$x)oW1vUq4{F4Cr^OW)eVwzjt9xHr#aa0XifvFPaN0#y( zfhC2uuLUw5tz_qCbVz#N^*ZGN|YCWU}Lmk9OIFm-k+|vk#p0| z$oo7z>vegNtvzf{svT=**Voto{P`n(E4b8gBv%f;lk~s~c-yvvsjZoh9QvOm@8R0L zm3bVFly&Wlq84>t#R=K`z0&*9e(p_;62lG=#xu8{v$dZ4%#;T|rYaazGD->y8JU=j z<)3{*bEQcaa*MnyuYZ4bxJW`={H{udZSp{z;D)b&&xuQsW@x?wtp6`}K_MXyy&A`F zpF>7Q)V1W~iPU_u8XD4Z%)WL=V8*WRf1fDRugjly-d$B%#ZIwMA7Rs8qJqO5ZrQjLlORQ!S@Lx;mDb|Z!j#zMJH+z z4Fk0_HD9A%=dSKaxF%{r(&|?Q^W`v+`J)n3%jy zPiJ~9RSKVB#4$HF2d6;e%wy-9RIHwol9GZ#SgAoVX%eitK`k<?3t`QwC^-jdAOFJJQKZGwG$;rzaP z@=?>P`0ZP!;0m0!BH@?MP)kd+^R*>#cWp2!Dd}xb%gKo+Q9k;H-Z$`z+)W^AmjHGS}GY;4L5o9r)b&$wL9Ya4&79T*rWA}rij$&ts) z3R}FtIbJgdg)0#=$fnpB&DGU4Jw09a7H+le6qmlza=7`n?ArJxpTSy5JLKi%tqo>=99y&(%zgjf3C?GJt!Jdc#EO%nW3%8}cn^y< zxY8-t;={ti($dm~N%C-^Fu@@-cyA&_bLxIL=XQ2>7K2q;P*G8lm38OdJvG{xSM4Sb zG9Ap#@8?rfMalS`oSbyDx38?OZh8sRBCsagVJ9Q0MN7#@hQ`N(c!mjr#El&s90YB= z$=yYqWMpKRt7342gEzzE^SJo=lNF`yETcn7bDs~?=iG@a;5am%%m-^ zEiFk6S9j39>@hdySWu?-=(MD@cxVkPuL3GA!TF}uDkmguinAWIU%QSlFx#j zuC7u+hx#5DIy@3PJyON)qyS{ORteqVgu;1Hii>4^=yBiM|mn%-?{AejkHhNer!3Ep!+14~h z+fA>7AMdNG#_hhE0E^x4|mf%G<$W`qU0?9 zmZzuZkF70kF0QY<`?`%K@80PODMTvXy^f1}|Cd~zdXXe8v@WmgtcaA(+{#MAZ3UOB zc?EHCw?5|wh}|(-^RKP17p97`Jdz1-6K+`t5IGtHIPaIr>#+7z{26%9fp;o`{ zS#3>?PP4wfy?u3c^(wOV{rmToB07pHv}3DJU80i=Jgv_E98=&~!Y!2W9+{dFU|_Jk zLi{>CeQRwEo(H=0NN@V7-VE1KDunE$1>8oF7lx6(cW2=5qD{>U3q@bdMFdt zzxbRocQ-#jzmsZhxjRnNt*E4AY;t>X(dozJJqxeJ)}XyR+_5vY&TFys3XH4dUj)Ch zv9SqL;m4vUwk5D=CkJ5+jec%cH7;O~h+b~|^IL&=_4)JXWAxgps$%Wm(;OP*kkd6z zbh>7z2V0eym22DEeqWmd`qTJC4`-ciCQ8jCB~BN-wi_Ip&JuaexKd7-9+l`UuCC@! zOd#VQ5IL81PnlwhX+`|{^=o?iapU)wRqZHG~caekyVHXY>I@i zp)t-B@zL+%d@a-OJi#~F_gK@n$RM}jWbD>0SpR>oGZ>do5JNi#;Y;N|*+JFD@ z4$kuOgrVO%U$YZV%3s@l7j=!eNtu}r_qLZcDOIi(YnfSE+Au~8uHk>#L2~li&+vsHDZx8*+&7f=^zP7e+J>KeRy<$24wLOOtq)Ks$7K1#wn<%FuaTjkPRh#Zdl{^ zu*$FX#Wf&M@#$k}EZrXB+0lPK!9Cwvds46&R941;!0Jl|h{c7DX+QTVXpEB#or`*2@*VB~Jc#UsAZ+Z3VmC+#c6#z_MzI?g+0XrZeVZ1!QG-%nsXlP=h6DI@^ z(u)&Wbt6_(Ehu5&BMAryD0!?hFgQ3U`6Z6rp5-0_OA*5YHywEPBD(|ro}|7$=qq9| ztBm+~o>>O~UPqic-y$i6q^l*YlL@&}6lr6ct;zmusQA5!H-2J~btCk0QNZ;b5==pk zbe}8fhIa&vyh{xlJeRv-Wn?+QCR`*c|`cK0QX03=%~V}t_GZ|G(ZMS*Jf zpH)^?7W!Fi&o>l@&_7gDgWebxKGQw4&U61hz&R_?yx&i=a`T<7xJ7tiA0pwZFmu_@ z*N5bCnuxS5Ecm@L=k^db(9|S+**3hO*tv=^eyy5Iiz$;l-0xXYv+&dXkB zRZn_Wkb>vyLPuiA=BqAlZrskAcs6)~S)%dsE1yGd-Nzv&AZXQm2>h-{yq|Tl!{Ybu zE)!*OadEUU2~gYFxj6|530LxIxHhnA#KcL%mFn;;$*)Dc5<|lQ+0rtFD*!oDS0~_3 zJI@gD8pD;@3H6NLT3HGD$w1C)YqUu6D?1x@TDC^7w6tSz*vVa(iqiSBh!X6s88Cbe zJv}{5O&-T#CZn#Q2af(lcyVP(+1mU>HIh~;M3S~vuha+qt`C=p2yB0Pqr!bQeGEqc zeikHd%Uw4k%%2AsfMgTXZKnB(le*nigo=%dJb%SrtgFCE#Om4GvkRz{p%7)869CqHb=b#?3CY;valJZh2jZ@Yt{ zZqCl8QH$~l3Wk1XuJT&T>_Edh9hW+Ae^a#b`!v^IU3BD!7K|MvUiS8FSo^p2^{0ul z_E1XqyzZG_0zrxMa({onB40H?jG7w$wi3aa>FLeo<;qoVn5Lcw7J+ZL3%SDdBYBp`IaiEk|gMPZSM0D{+`O z#s@N@^V&fF;NVBuHh}gRpg2lN(eyq$U=k88udLh$jY&qP(=x+D`u_1K z0FkFrVt3$ebU=2pOKnsgoRAmTU_FoyApU+54BqAY^eMBcEhls@`=LPT) zRg>J+-A%((s`LJNq=k*m_wV1+UcU}^y<3%CTbmNg&c}DScCL1*s;VmAuOGUx_k#s4 z;Z71f?%z;s#Ip(nK}C4Zi%tAD&DF)gI+_*4Pp0xENB-^lU1f7~`dFVksLol=k3f8$ zo=#;Z1+8J#^=w%HTQKL%o4ykfic$G%ZO}M=Y<&MdQ|HDJ@^Y^lxgw9fgroW@`r(G& zpvd9tq@;<(wwF%Cnox9i+=XK$ZEZ`A@w%<8tejk3^&7ow1r9#4varxe z62IrX+81(*L4Dogs48P49Fz(?JUl@8CKa2YIISQBFzleB5_TjcB|Q<7X@n(fZf*vS zlrnK7kf%<1b;-OnE(ohhleA^*>pd=u-l!F9Za^6 zqo&Rr8`F&2QsXlDQf4S>H(d$pWopnODA4QH+GPe2!K^h z;Z&!*efT%ImzBw6{Sf=gbJy=*bPvKZ`}+Fi;_kM8{+x^)HMg>2GOq_nHvzS_#`~B{ z{u%%)77#_CNtKqC=GThLKYLc~B}yb9ai?1dird5lA3gob+WEaX)?tCUexMoyuLXAB zmNjzqk2@2w>f9j;Q^^pP^UL6Ox{QH=!Udq;{FkKr^wu_>n6|9z#ax}+6UA>6U%qgK zIh~%KuC1;?b|oN zM6kcb&kCEa**|>>T5zq$?pOy9RSt1BwwKe zsWGgz1k?xYio(Z41O&f#I;mL*Lx;mU#iDGXK5Yy$Wj8mGqSt;>H#h`RB1Qv{FIh zEhUdqXYfA|%`k_75feWJ_d13Q4%Y3>@81Dr)b?3%^&G2qt(>g?9G;zh9Um|0l$M!E zJw=!jTBSOsEP$(#39F=;#asYw&c(%rMo0(r6}X_qZAs3+1faS8g^{p1OvOx1>C7vx z6SLo8f`=loovj%L_3F7{JMQPUHaYdX-ZfqLoNH}H|(AJiZ0?eDW0)VqTt7xZIk z&TV1;@Q~U*R1GipkMt#qAp0&+BTo2G#we&G_;Q!JMS{V5U{2_PQ_QT}Wv5=m0~_0u zl%IcB>-&xI&JC5~v|ckVP^)7zqoVMAaQbDUq_R~ffoKen=?5=^83D%Rv|_bFk)&XF zXsAgmKh8JIs65bQe^082p1sKRUk;|de?LK-Cq@>L)LZ31_(mmm5m3=a9l*2XexFyI z_WvST2j;1O+$%2r93*&E#@z51#~=L<^lFhSph3cZh{I|`1)E&|A62?{&m$+5|L2g{ z{|MI-SDY2Iq_yaUgoG@R20Yim61*$Gtom=V^oov5Y_sfqTKW6j?33l8r>i$TYCbO%PlhxCw&F@UIP)c^kFB_ILviQrl z?kc_t3!@uXTPGqX4^zC1HWapu0&@iKnyRXnkpc-OI^#(+|E*p-eksxAXgs1NTEhIa zGLokNoct-i|MK~uAm8n7;#~hmL8I zy%zQx)A)PR<+p%451szCJ+2s7$jY*!60}bi*`X<{H&4n{nwr zeOeg6q0O8ik05w9U!0La1%@(^yc#8+L=NB}IJeORbKkwg<<=2LUXb;4EbZW22)+RQ znM3GFApq9&*RSvJ;$FFY$>7Un%8}vWhsT>oJ4>?Ij}(*<1RK`EvyR!j09%P3&4Xnv zp~edGv5ro%;@!459G7~?JEe73r`T4~ii)0vrr|T0>?g;^6yG2cn|JJJ9 zyq9QcRocjdQ{lzo{yq)UB%=U!_K|m^6R~Q(QDpDR2kSckD9b>$gz{;09~X&4!qOV_ zUZPZg^hjDaOk5CwK~698{AP%xG=~NXwX-}%*U;6KGk7^d)g8~I0nKTL6J1|TOH1l_ zb0A$v7MoX|ou6NaJ&FA66VPql@qQ#=VOZstgH+wHolK%%jWIvH$mCxCEg?mca%cAaIwP`AgEEcF$*WVXY2+57rK_j+8e=vP zz$jGpY(r;w@+5+Vu^$A`8B$YECZl|I`}sT@!r>scc6N4tpw>KzkcpxiUl_fDhB(}I ze;#UT_dvjE1OYpalGwDHPR9K%4*l?V{8Ogdvc{8Q(6)xMB~*lWBz=4u z2B>>~{|1!c)?0%MD8}@JROlJ&I06%|(#^%Cucv1uZaKsIw_NC5SN2-J^W994qR-1N zPRazFSJ$*6b0ny6%v6h8oxuI9~o&~+F@Pd74|-YZXB)_c&;cXr?y{`&C}Q0 zI~unPTt}YZ>}TCJ4?@NbRRRdjN9MxA!Zg?%C5%U3T)RcYVW7B^Cy%UL7$0{9<|>v3j3Kfl$D$#UbiQ58`o>YVsoeuJw1O8vKf=5UA5>D?gvAS&7f zJ3QagLUaGVmIN}&d$#fHUYxx@D5?{euJhsSiOJwE4FO=I0G=UsX=w3bH=wGd)gQ_#>UIN+IkXjratp z#aQnw`5uuoLt!ozHyQzs9LmV6-Z#4%JDX(aE9XYT$SA9igr0|(=3DTN>p?{_VxwGW8vA(*B{reWjv{S#^y{heKGH~twt(OuGvGbj(kDme0l23?|jV<42Fl~ znxYy(s_}VE=O;GEYx+3Xf|+qI0FBBr04m!H04+FuWDR^}mmE0-#RpA3r@T^a7pF}Z z3hJ5*7LmtYWrbNUd;9zC;E=|PteX@L6wuTLL_IMyq@EjvWQwT!FMkgNR))(fLz$c0 z3W5~s-&FI-e#~7eH|w@CjE`Qn=u2){K^DmulC|+9FDE}{d+&R80$CXwoe9$^)pyTl zb2ORvnQJR6d6>mAJvWOeg`O26WaM+=il=3Zg!QX!Nwp*kd&CbFa%yAk>DyBgy>K31 zzIdV9zMxJo^C&A-MoFn3%+ap1JyR_*)d=c5e9kjpCW1HD>l_!wwY7=!@a=GHy>f3T zjXy4I6#1-8!YH2;82292rqp|Ri5GYgm{)KkiW}efj?nnd!BR|Vu!ArBe~eDe7|rMrf!c_?7-1a&WK(nkVfXxVsB_-4ND^>yn`NQs|p`4$C1U&h&)0< zwg%m&qq{rga(@8B`0518QKs))+pVhKDRx6{4r$2fzT^eeS7b}cC;)yM5mEk1yUvJ^ zfL7F?B1hQ134NFz@VxBbqK*9>fZ%@g{X{^B$J7HBQXk@AT`c|69G!`mNs^W@T;7weY}|Oob3-1_-mG$?rxW-# z=y%SYkOnD)>IC^bNI`+g1g2EE%>+C1ts=ABGw}a_XTQXwd?TAa)>H&vKkf7oX6xA6cI@8;l_Q^#|NV zOndyD+v5pCa!jp_&$h_y3~P~6OI(-_?7{Um`f`~*V)#-@n6_vUZxg6EiLAB85pm>< zwcylxo^Sp5vF@bhP@4Nvm61@LsR=xQ)r}EM=4o)A*uGMI?&tu64sR|YOkK`zX<0MY zbiU#LX-V89TvkdK90w7j)#km9qSyKPVN=}AOweV(`wHci4fTwr*jR{OT2@XMlq!;( za-FWUf)LoSI?^SKiBgs=_r`vC_+^)3MOFU1_i!~d0hpUW-fr)bXFlAFTqja=YQ9*a zIm+pL76u=@dNeyTYq34mn|?5lFOBZ9n5FuuLd z{SEHFTNx&Qw=xKr&u~STu4&0vmPOwiT1(L$BjcE4d{hUuq1kS~45tN7#AlbUW2;Vd z>qmQ^i?)aPH@bY&>4zsLWsl|er76l~k;!!UX>&%AsL&x>B>==eCL z%M(c?%1|a~=zB~LE=D*+7)lthT&`9;Ek3B=xD*ykk#P6##)a2UjsJEu{1aLN@IXal zTw#g0_sX9w*3?2*laWxmejU;X5RGveCL_UnS>dqofKdrOPhF0wt-23wuP261hS6rO z$&XsDMY{VYn6$w8r0bu8@CSxq^&C*2vZEt+9i>1B(5U-10~)* zuPrUVq9U$yiS*<9F`d_fu07q|*B*^FPfgWkWud8Xp@}8Mp4R#u!~y?BH!Rg;&fEQP zVBY`$hLn`_Mq220x#bI?R)t zcki|!k4GYk)_s=t{P|_PmpKlDY7eC?Tiz0T{$iy3TZW~!wpMf7*q9iRr42zh&be!d zf(-#?o4pBprlj7DBTfnlclRU6bQ$y0f;6Izu6ubs5o8gKpC-G1#-eBGo?2T2T*60j znyOC~6_C||xJ`L|f_nPqrZx8J7_qG>!}0NPJRaCBT?Aqu35khKqbU%FSE(L&Gyb!u zaErUk>g!*&Ls`Q?YEBMa#T7=hPj5gSL29G4#>=r@JOJ+*31K(ZR#qZvO!<5!Iy+wu zuH~q-&-eJ6-@^%!-jMbDbbDk;(b2e%+C zKK=!o{ndZ;7A#C^0hbK(UK^a4Af8)nUbnKh&&PQN2nT_II3!^Vhj-QN&A%+mN~DlC z03o=-1W%=naI9bb#rWPyL(vYy(nTv4A1k1?$^DsQI<^ zals;cdEW2B$ItIVCSMNprWHmvx5FPlY&8>_uNo0ewVa@XcJV-yp}eA^x2MM>VUf{4 z=aZU(LhlWxxQq<;A2RGoIk>l;4hCZ3Ge$v2qWMdT@P@Vq3gnM_dRA5&-^-dZUcW9; z`liacwzV}kHn!*Nwp`tC4K;bKEW*OCdslkQxR6vIaNQA_ zes7F^{zZ`B({I3~0qd~8yZil*+T^*}SuSpFnK)HViKx)fZ;t%n>vZt~uy3|~6%vvn zd+bBg=T2jJ#=Z^oM+_*|>2M5d6hw7AM`Dp&j{vPEZU@csn9}U=wy3CtJRauOPd zyNrSZ+zug_2M^{=a6bB+KI5X`#u4*V4NuO<7$~_d#oO+V{_M+5rly4Wc%z+5@Mb)q zyAvkq1h0{_ksej)g7mG*2xsZVrcOHq2$_1*1zoX0U%ABni{kdEnwpx$8C9fJ9*=zI zjXd>@wKawtS2-h?y$Xwpvcug_;YF0->kn3dw)VtIZ&I46U+;$xTwIlx9y3*`rR%Ut zKl|YRbD>FPzZh!vm=%alye`k4VPawqr11^bcMPiO-nwx^?Ag5-nwdVMz}eYZkgQ3y zKZ*Hq+H|FZp#0aPm_if{8USFN0uaN#t*%NNzb?`$Bqt+#9vJwpq@=a2EnBcR2hhxi zg*=5MIL{QEqOfBON~wgmZkhHdCBZU*Y;!rlDBd}BJps-|=o&wTGKdDNm=z>oyoZ8j z6B_zo!kfb5Cr{SkD1hh>gsq21dr%hw<~pprVHg-QGc#JfUo>94oHhTc*XT{kf)B@l z0B*UfqvO?U*Y2h7e~zLM_ze)nxpo#(BNbk23u9v-MuOTkKEa4(fpwyV3f+l+f)pm0 zLI7OIwOt{w21WPVjypJc5@r6@J<-XdBO|h|guxb;mUMwBl!{F~v9YnBVB}&#(C><8 zF7#`r;?pJSiyFTRU-a*6qN09n!MM46pD@Eh0=gXcoXcwhrcj|$W{#QoT4Jm%eI|^gX*rkjisgRp<7+gpf&U<2%+W!!sQ_5rKuSY z#|DzAW@fn$Y(GNn7vu`*9~fX47OpQY?)eZG?`s6iK66leU*!_&UUbo14bs)*(MZ1U z@p~B}4^g7$I@zk>I<{bUfJY7@vlFmpQQtpcM}Y}8GCx0%fq-w3w}&X>-hF_6>x%O| z38a5SJh-^+?Z-z)(ZB90r7o|neFRQ8y*p)@xdrdE(CD)%@(7PoP?8;}@-#%w080=8 zXe1$Fym58C4%#wTN=a7M*ZBr7FpBmTfh&AqyZ7YDla%&NMhwo%f!r)x-A9jtKRQKI zfVhH-o05_OrZ0p!ftvy{9bAL2jXK5v&2k!~N^$kvW_oa0L23+j#l{_vl90M47uoL| zq{FA4rE4=kTU6G}}2iFpN9Z>V-&(FLEJ+Zf%sp|YEpng%|9USD6Iuafz5ef_A9d$4f+N)$O?zqhCQw92AC6*LKmK7qzMm?l*w_MFMazrlipP_eDM z{=~nVj;fME--c7b$7#*eZOZX?Uks8{5i{u6R`$GtXHB0&^gGfXjWql^-_Mh`F-5y2tDT zRGVpDoADS;LhN=_998+XYL}M1Ww4@}g7Q_KZ67JZ5*SwwtZQzlTxqv+5yBa-v zaI*y1jpimNA)sqQfMeBB^Ogi8Gfpn9k(L(Y?pXTOx=}!gC-kC6!lDkoK5gJmw^k z?Fl?LSP;IxzS-9#wE3+@a)I*G$)H{?Ss{sCjY-46U>=n%AR&b&3Ly`0eu6`A`cPF& zR<;Wu3GS$eI>Q`Cfl4NOg8Z-x%&lZ80Cr|(VbN{85~bYL-+w!-oltOLL#{P{DaiMY{kK{&x5 zZ+&aa+~To#_Ztbazxt7!E5vL1;*(E!U&qC1z$Rov?Dr*gt264EKy8k&s;oyj?Gi8H zcmRq1eeB(EAXfy=E6D&CPQh=AX*L)va=CV!QL{$%PeAUFK=>jdc90}3)a2o<78r!# zv76>`cF6NKt6NdvXn5hvi2CI0va+bqUT6@ApbU4&;6X$SgAuBj#9QUlj6Im>@dLZF zEB#*vCeT)MKfzUogu#0q;Ymemh*+h?rduQ6w1cK;F`cANP6V1dI1Faws5%uGt-L@; zNa*6~8q){CE}nA*1VK=6@PjYTPpWNE2CYZLOY)W@fl!~K$No4FuF2wV82|DGWesO= zqd|;=aKuV6`P96%&ggu8H)2zulv6Y4W5SNhH{r$U8(Gp<^ zqfBXOLcik3`Rw8GtG;SGq3`_q#d#8M1<{eeWo2WWrBgCO`&H`+2nl&si2(#ZF)%1S z4*;tK%>UHYO#x5+q|TO>OW#Yx;XsFv7N~IB5DL5hLMt*ZH&SLLiaNenMAjB>h{Ayd zJ+$7WJyiT)2Sn48(^I;*r}*Ql*Rip|Eu|;8w!-q)=ta93^M4q%1=Jdx;ufb4<^-h-HoqPx0`h!%z zfRW5r;?PA1tj590ec%q4;5^h}G>y( z(T7~ln6=RRBc%A7{6u@{WthY^jQq#L`cNGd`zxFR*E)Bazt3i@n~gjJAS`2dGsH*| z0Hk)Qp6*rb>uskG6YqfS1(AGt`Ou6=j-*~FqS6ZwZ~zRWbNiB#6z6IjeE@liByzIC zG78WNjkZ3YZX0M}zJkfZHK3tbnwd4*ZB}^0iK#dcdH=6N7~j7M zgtH9s0VGydR=$yjc{#v89eovUv%7G{qM@8RiOd?ME-D7v7YnWscROx=|2PXO7C^@H zm%&AX!Nb~z52agsX)*YEx;7(WtZLr`;gMKp#u3c+{(_*oG8=g=~F15QqR|k4u&NX((`UE780 z8}5!v*az@wocRD?8U~mvtZZy~$b$TQOw$fm1)%B)Osdm#DO~3AuCDjJxX`ajBM3;( zZo;q-b?H;o90^bkbtlDG3C@Bi)%J6Oe&^mtKVn#+k^+(wNdar~FFTBjvH#^vKWqlk zNaAx& zJ%qSjq%@YtMqbkDVCLYWV`25Z&kT^Ibw(nk9a|s(0lgoErZw5%hL~gLbaY79my(k% zhX6Ykk^9-rkeN#&z7{LweZ*ODlbZVCt>KxxUo0xCl{xq^oIE``nlnEW%3kasCf;Gb zyabHgnMO&(q=32vDX3)2Ul95~iKfspfOUXI>D%bIc$xe0>&tcE9@0Jx?&Tg7j!Q~{ z2@f{?Pw|Koh!R-I{)8|D1m%d@iQ?`m0oVH{(<&hKpG+&VBr+l*X{m~HgiJvN%o``m zXN%n-$-z8JiH&`;x$scX!P?sMhm$gtXV;{j9{Gqf=#-EqF|8(M*OOJDr>lj>WQR1D zN#lR}YJfn`rC?G3=8`p-;eX?q;sj&de&)$_MGmzKxhCxYWg2PLHy*F1fi2b#T5LBh zq?ilNaz#LE`H#Ml&*|33N}9OtR8rBL#oxAe@vtUpf5*(njB(Ajvo>Y1a+8=gKbCMp)Cx=OJ~}%iF-8H3#gN^l6|j)KfBPADrs2yE z{`_i#zkT}v2KIzSMB?J&m~u&ulp`smBMHx2VMuyh5L7JMF1Sh`UOs6o%4BdnclRic8-M>#0J4*GRW;Iaub6=+c4Erpc z{d5y@`|15HgaMC&zxfA%3vv`5S~RD%(4kD6Q99Fmq@`MHfuwyNd)fZfL&k z8W{MZN|rfDU9z-d1UVch@H3ga)k24*-Q4)*P6A?c$mAeQkSNn3B!E^KlraNdFAXK8 zL|Fq1Y4=T(6eyc6v9^OK3D5nq^UhgkrLmw0N9V%Em<-7yvh-aG9m zVh0hs@bUEp80dMlZxQ)TIDx}8Qarmnd_G~1(D5WjJ`Z+0>Q6Wv`X5bWFyvZRRCHYH zXYBw!D=0kNr$rxr!>IB+bQ@?$uuN+rPLhrOgK>ojjVt-oFsn9jL} zt_Ig!MFoGW9!6Qp*)h2@&^U2ms$AtYe+%K0+)vOhaJW_9dmkhF^aV($efDmymhxaH z*Ae&|OSsAf+jbdH@+} zKM9oqV98mbo0<-UI=x^%hwLw7(s6P|Ykltq2^?jLwAsbf5fH%YWeNIklYdnXa%`kL5_dQ$%!$$8E=4|j=`V@zl$1Kb3 zwqBB^6x=#i(>5(t6$M0LU0N4aimHt^g!$7#HvC5#i?DJd~b@NiSSn$_tH3HnXczk zH$+P}kz~FvEl@nz+k1UZh1Yhnx%J-HsCNx8Daf7#aVuvR3gC2|6izB&RG`H@qrx!G zWyC&Bwot@AheRF~Y4@=2DmPqb&4fm;Lv|l+6^SuOwg1o1idG;@eB(uVvHs;gspI-1 zyIx^w54rhxdqXtL{&XMp6Gh&^00C;+>)kQ|0YSJ>QNl(X49tf@%o16vcZ#WaV&>@y zg0_$k9}| zu|JzQ0m4>5eDv70IB6(Jk0b?Ut~~NzoE>qWCLYMfqcvA{b#)~Rx>_qMN16|||5#m3 zOi2luLH%$S9T`Q%J`j(0cX!!F9KlPubmK$zlU#l`g;*{(Ap`#)TJr0;SX#RKMBY=IwPqN|bJWqsYGJA@ennFY4WCUal zWDwPp%66Oy+rVW6zdO4CxCa_ql<~hCBNWotQHz{)8>DO$*bND}x02rr(MqtU1H}9V zV2TP24gz3vh<~MnWUFoHW1jkUja8>yjFrgLKps{bOm6$WG>(fkmckp-2_a{XE*(MY3I+`+55}PsD~5G$<6%?k>EF< zM9+7kAh^O;J`b~Ee72Kfo;fy*jEv1&sPzy#j5Y$cV{2;*-ZT8*7E}NCmwz~QR^?Zt*NaI=ozSpr@OnPwDe}%Gx#YhFqQ(S7xnXe@bSxvi^V@kz?&QKfBN)^ zu@4&$FQ3x}64%h9!2)?No=x(85|2ulF{u~AnoGdg?d&KC2_FouT zAD%|m9hMFr_6eYpt>YgRgD{U<3n_qoDi+A2(0aiR0j=7Cam-NY&p0@QSFh~pLjy}u ze59)CZy$#mMoOmrPkw@i8Sg4F2&zvZD1Tip=5hgOO}coJ^w!|Bkj)s literal 21184 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 diff --git a/docs/source/design.rst b/docs/source/design.rst index e59fbacc2..152110769 100644 --- a/docs/source/design.rst +++ b/docs/source/design.rst @@ -177,7 +177,11 @@ For example, if node1 subscribed 't/+/x' and 't/+/y', node2 subscribed 't/#' and | t/a -> node3 | ------------------------- -The routing layer would route MQTT messages between clustered nodes by topic trie match and routing table lookup, and follow the rules below: +The routing layer would route MQTT messages between clustered nodes by topic trie match and routing table lookup: + +.. image:: _static/images/route.png + +The routing design follows the two rules: 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. From 313f4568ddd49d8b73fb3abaa7b09f75270aa76b Mon Sep 17 00:00:00 2001 From: Feng Date: Sat, 2 Apr 2016 14:48:50 +0800 Subject: [PATCH 10/14] PacketId and MessageId --- docs/source/design.rst | 43 ++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/docs/source/design.rst b/docs/source/design.rst index 152110769..f89ce3e5f 100644 --- a/docs/source/design.rst +++ b/docs/source/design.rst @@ -32,15 +32,19 @@ 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:: @@ -65,8 +69,8 @@ This layer is built on the `eSockd`_ library which is a general Non-blocking TCP This layer is also responsible for encoding/decoding MQTT frames: -1. Parse MQTT frames received from client -2. Serialize MQTT frames sent to client +1. Parse MQTT frame received from client +2. Serialize MQTT frame sent to client 3. MQTT Connection Keepalive Main modules of this layer: @@ -109,38 +113,37 @@ MQueue and Inflight Window Concept of Message Queue and Inflight Window:: - |<----------------- Max Len ----------------->| - ----------------------------------------------- -IN -> | Messages Queue | Inflight Window | -> Out - ----------------------------------------------- - |<--- Win Size --->| + |<----------------- Max Len ----------------->| + ----------------------------------------------- + IN -> | Messages Queue | Inflight Window | -> Out + ----------------------------------------------- + |<--- Win Size --->| 1. Inflight Window to store the messages delivered and awaiting for PUBACK. 2. Enqueue messages when the inflight window is full. -3. If the queue is full, dropped qos0 messages if store_qos0 is true, - otherwise dropped the oldest one. +3. If the queue is full, dropped qos0 messages if store_qos0 is true, otherwise dropped the oldest one. The larger the inflight window size, the higher the throughput. The smaller the window size, the more strict the message order. 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 broker and assigned to a MQTT message. +The 16bits PacketId is defined by MQTT Protocol Specification, used by client/server to PUBLISH/PUBACK packets. A GUID(128bits globally unique Id) will be generated by the broker and assigned to a MQTT message. -Format of the global unique message id:: +Format of the globally unique message id: - +------------------------+----------------+------------+ - | Timestamp | NodeID + PID | Sequence | - +------------------------+----------------+------------+ - |<------- 64bits ------->|<--- 48bits --->|<- 16bits ->| - +------------------------+----------------+------------+ ++------------------------+----------------+------------+ +| Timestamp | NodeID + PID | Sequence | ++------------------------+----------------+------------+ +| <-------64bits-------> | <---48bits---> | <-16bits-> | ++------------------------+----------------+------------+ - 1. Timestamp: erlang:system_time if Erlang >= R18, otherwise os:timestamp - 2. NodeId: encode node() to 2 bytes integer - 3. Pid: encode pid to 4 bytes integer - 4. Sequence: 2 bytes sequence in one process +1. Timestamp: erlang:system_time if Erlang >= R18, otherwise os:timestamp +2. NodeId: encode node() to 2 bytes integer +3. Pid: encode pid to 4 bytes integer +4. Sequence: 2 bytes sequence in one process The PacketId and MessageId in a End-to-End Message PubSub Sequence:: From 9ed5d4fb86b61ca725b7cb2ed47c48d4a447185a Mon Sep 17 00:00:00 2001 From: Feng Date: Sat, 2 Apr 2016 15:08:10 +0800 Subject: [PATCH 11/14] update guid section --- docs/source/design.rst | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/docs/source/design.rst b/docs/source/design.rst index f89ce3e5f..04f6715b2 100644 --- a/docs/source/design.rst +++ b/docs/source/design.rst @@ -31,28 +31,22 @@ Design Philosophy System Layers ------------- -1. Connection Layer: +1. Connection Layer Handle TCP and WebSocket connections, encode/decode MQTT packets. -2. Session Layer: +2. Session Layer Process MQTT PUBLISH/SUBSCRIBE Packets received from client, and deliver MQTT messages to client. -3. PubSub Layer: +3. PubSub Layer Dispatch MQTT messages to subscribers in a node. - -4. Routing(Distributed) Layer: + +4. Routing(Distributed) Layer Route MQTT messages between clustered nodes. -.. code:: - - -------------- ----------- ---------- ---------- - Client --> | Connection | --> | Session | --> | PubSub | --> | Router | - -------------- ----------- ---------- ---------- - ---------------- Connection Layer ---------------- @@ -132,13 +126,12 @@ PacketId and MessageId The 16bits PacketId is defined by MQTT Protocol Specification, used by client/server to PUBLISH/PUBACK packets. A GUID(128bits globally unique Id) will be generated by the broker and assigned to a MQTT message. -Format of the globally unique message id: +Format of the globally unique message id:: -+------------------------+----------------+------------+ -| Timestamp | NodeID + PID | Sequence | -+------------------------+----------------+------------+ -| <-------64bits-------> | <---48bits---> | <-16bits-> | -+------------------------+----------------+------------+ + -------------------------------------------------------- + | Timestamp | NodeID + PID | Sequence | + |<------- 64bits ------->|<--- 48bits --->|<- 16bits ->| + -------------------------------------------------------- 1. Timestamp: erlang:system_time if Erlang >= R18, otherwise os:timestamp 2. NodeId: encode node() to 2 bytes integer From 2d1b6775a82b01842296ec709202738d3622942d Mon Sep 17 00:00:00 2001 From: Feng Date: Sat, 2 Apr 2016 15:59:02 +0800 Subject: [PATCH 12/14] the firewall --- docs/source/cluster.rst | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/docs/source/cluster.rst b/docs/source/cluster.rst index 72a4a1bac..84c0751fa 100644 --- a/docs/source/cluster.rst +++ b/docs/source/cluster.rst @@ -236,12 +236,32 @@ If a persistent MQTT client connected to node1 first, then disconnected and conn client-->| connection |<--| -------------- ----------------- -Notice: NetSplit ----------------- +------------ +The Firewall +------------ -The emqttd cluster does not support deployment across IDC, and the cluster will not handle NetSplit automatically. If NetSplit occures, nodes have to be rebooted manually. +If there is a firewall between clustered nodes, the cluster requires to open 4369 port used by epmd daemon, and a port segment for nodes' communication. +Configure the port segment in etc/emqttd.config, for example:: + + [{kernel, [ + ... + {inet_dist_listen_min, 20000}, + {inet_dist_listen_max, 21000} + ]}, + ... + +------------------ +Network Partitions +------------------ + +The emqttd 1.0 cluster requires reliable network to avoid network partitions. The cluster will not recover from a network partition automatically. + +If a network partition occures, there will be critical logs in log/emqttd_error.log:: + + Mnesia inconsistent_database event: running_partitioned_network, emqttd@host + +To recover from a network partition, you have to stop the nodes in a partition, clean the 'data/mneisa' of these nodes and reboot to join the cluster again. ----------------------- Consistent Hash and DHT From 68ea42d911a8be81c6b7a92873ae659abbf58c2f Mon Sep 17 00:00:00 2001 From: Feng Date: Sun, 3 Apr 2016 20:56:34 +0800 Subject: [PATCH 13/14] doc review --- docs/source/design.rst | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/source/design.rst b/docs/source/design.rst index 04f6715b2..660b9f39c 100644 --- a/docs/source/design.rst +++ b/docs/source/design.rst @@ -45,7 +45,7 @@ System Layers 4. Routing(Distributed) Layer - Route MQTT messages between clustered nodes. + Route MQTT messages among clustered nodes. ---------------- Connection Layer @@ -63,11 +63,11 @@ This layer is built on the `eSockd`_ library which is a general Non-blocking TCP This layer is also responsible for encoding/decoding MQTT frames: -1. Parse MQTT frame received from client -2. Serialize MQTT frame sent to client +1. Parse MQTT frames received from client +2. Serialize MQTT frames sent to client 3. MQTT Connection Keepalive -Main modules of this layer: +Main erlang modules of this layer: +------------------+--------------------------+ | Module | Description | @@ -87,7 +87,7 @@ Main modules of this layer: Session Layer ------------- -The session layer processes MQTT packets received from client, and deliver PUBLISH packets to client. +The session layer processes MQTT packets received from client and delivers PUBLISH packets to client. A MQTT session will store the subscriptions and inflight messages in memory: @@ -100,7 +100,7 @@ A MQTT session will store the subscriptions and inflight messages in memory: messages which have been received from the Client, but have not been completely acknowledged. -4. All qos1, qos2 messages published to when client has been disconnected. +4. All qos1, qos2 messages published to when client is disconnected. MQueue and Inflight Window -------------------------- @@ -113,18 +113,18 @@ Concept of Message Queue and Inflight Window:: ----------------------------------------------- |<--- Win Size --->| -1. Inflight Window to store the messages delivered and awaiting for PUBACK. +1. Inflight Window to store the messages delivered and await for PUBACK. 2. Enqueue messages when the inflight window is full. -3. If the queue is full, dropped qos0 messages if store_qos0 is true, otherwise dropped the oldest one. +3. If the queue is full, drop qos0 messages if store_qos0 is true, otherwise drop the oldest one. -The larger the inflight window size, the higher the throughput. The smaller the window size, the more strict the message order. +The larger the inflight window size is, the higher the throughput is. The smaller the window size is, the more strict the message order is. PacketId and MessageId ---------------------- -The 16bits PacketId is defined by MQTT Protocol Specification, used by client/server to PUBLISH/PUBACK packets. A GUID(128bits globally unique Id) will be generated by the broker and assigned to a MQTT message. +The 16-bit PacketId is defined by MQTT Protocol Specification, used by client/server to PUBLISH/PUBACK packets. A GUID(128-bit globally unique Id) will be generated by the broker and assigned to a MQTT message. Format of the globally unique message id:: @@ -146,17 +146,17 @@ The PacketId and MessageId in a End-to-End Message PubSub Sequence:: PubSub Layer ------------ -The PubSub layer maintains a subscription table and responsible to dispatch MQTT messages to subscribers. +The PubSub layer maintains a subscription table and is responsible to dispatch MQTT messages to subscribers. .. image:: _static/images/dispatch.png -MQTT messages will be dispatched to the subscriber's session, which finally delivers the message to client. +MQTT messages will be dispatched to the subscriber's session, which finally delivers the messages to client. ------------- Routing Layer ------------- -The routing(distributed) layer maintains and replicates the global Topic Trie and Routing Table. The topic tire is composed of wildcard topics created by subscribers, and the Routing Table map a topic to nodes in the cluster. +The routing(distributed) layer maintains and replicates the global Topic Trie and Routing Table. The topic tire is composed of wildcard topics created by subscribers. The Routing Table maps a topic to nodes in the cluster. For example, if node1 subscribed 't/+/x' and 't/+/y', node2 subscribed 't/#' and node3 subscribed 't/a', there will be a topic trie and route table:: @@ -173,11 +173,11 @@ For example, if node1 subscribed 't/+/x' and 't/+/y', node2 subscribed 't/#' and | t/a -> node3 | ------------------------- -The routing layer would route MQTT messages between clustered nodes by topic trie match and routing table lookup: +The routing layer would route MQTT messages among clustered nodes by topic trie match and routing table lookup: .. image:: _static/images/route.png -The routing design follows the two rules: +The routing design follows two rules: 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. @@ -307,7 +307,7 @@ emqttd_acl_internal implements the default ACL based on etc/acl.config file:: Hooks Design ------------ -The emqttd broker implements a simple but powerful hooks mechanism to help users develop plugin. The broker would run the hooks when a client is connected/disconnected, a topic is subscribed/unsubscribed or a MQTT message is published/delivered/acked: +The emqttd broker implements a simple but powerful hooks mechanism to help users develop plugin. The broker would run the hooks when a client is connected/disconnected, a topic is subscribed/unsubscribed or a MQTT message is published/delivered/acked. Hooks defined by the emqttd 1.0 broker: @@ -331,7 +331,7 @@ Hooks defined by the emqttd 1.0 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 by one:: -------- ok | {ok, NewAcc} -------- ok | {ok, NewAcc} -------- (Args, Acc) --> | Fun1 | -------------------> | Fun2 | -------------------> | Fun3 | --> {ok, Acc} | {stop, Acc} @@ -339,7 +339,7 @@ The emqttd broker uses the `Chain-of-responsibility_pattern`_ to implement hook | | | stop | {stop, NewAcc} stop | {stop, NewAcc} stop | {stop, NewAcc} -The callback function for hook should return: +The callback function for a hook should return: +-----------------+------------------------+ | Return | Description | @@ -353,7 +353,7 @@ The callback function for hook should return: | {stop, NewAcc} | Return Acc and Break | +-----------------+------------------------+ -The input arguments for a callback function is different depending on the type of hook. Clone the `emqttd_plugin_template`_ to check how to use hooks. +The input arguments for a callback function are depending on the types of hook. Clone the `emqttd_plugin_template`_ project to check the argument in detail. Hook Implementation ------------------- @@ -396,7 +396,7 @@ And implemented in emqttd_hook module: Hook Usage ---------- -`emqttd_plugin_template`_ provides the examples for hook usage: +The `emqttd_plugin_template`_ project provides the examples for hook usage: .. code:: erlang @@ -434,7 +434,7 @@ Hook Usage Plugin Design ------------- -Plugin is a normal erlang application that could be started/stopped dynamically by a running emqttd broker. +Plugin is a normal erlang application that can be started/stopped dynamically by a running emqttd broker. emqttd_plugins Module --------------------- From 67cbeb236ffa5c35d7271f7e9875d7a90ae9a41a Mon Sep 17 00:00:00 2001 From: Feng Date: Sun, 3 Apr 2016 21:26:36 +0800 Subject: [PATCH 14/14] design --- docs/source/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/index.rst b/docs/source/index.rst index f5dd4a15b..0ea7930a9 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -48,6 +48,7 @@ Contents: cluster bridge guide + design commands plugins tune