MQTT---HiveMQ源碼詳解(十二)Netty-MQTT消息、事件處理(流程)

簡介

前面這些章節,講的基本上都是屬于netty對MQTT周邊的一些處理,由于MQTT協議總共目前可用的消息類型有14個,如果再加上對應的事件處理加載一起那就估計大概有14*3個handler,如果每個來講一遍,難免有些枯燥,而且知識點會很分散,思考再三,想把整體的MQTT消息以及對應的事件處理作為一節來介紹,我們只講它整體的實現思路、處理流程即可,這樣對需要自己寫broker的朋友的幫助應該是非常大的,這也符合最初寫此系列博客的初衷。

熱身

一、Callback

callback

1、分類

HiveMQ的Callback總體分為同步、異步兩種callback,其中部分異步callback被標記為lowlevel。

2、同步

可以看出同步的callback主要分為broker的callback、安全相關的callback、OnConnectCallback、OnPublishReceivedCallback、OnSubscribeCallback,這些回調都是使用異步線程調用。

  1. broker在啟動和關閉時,會觸發OnBrokerStart和OnBrokerStop,用戶可在broker啟動的時候做一些自己的處理,例如數據庫連接池的創建,spring context的創建等等;在broker關閉時,可以關閉數據庫連接池等操作。

  2. 安全相關的主要包括Authentication、Authorization,主要是做連接認證和授權;可以寫第三方plugin去做Authentication和Authorization。

  3. OnConnectCallback、OnPublishReceivedCallback、OnSubscribeCallback,用戶可以在client連接、client publish、client subscribe的時候做一些處理。

3、異步

  1. 異步callback主要包括一些mqtt消息回調、認證完成回調等等,用戶可以根據自己的需求開發一些個性化插件定制屬于自己的broker業務。

4、lowlevel

  1. lowlevel屬于異步callback的一部分,都是mqtt消息的回調。

5、CallbackExecutor

  1. CallbackExecutor就是所有異步調用callback處理的Executor,由hivemq統一調配;用戶可使用配置內部參數來控制其線程數;來保證broker的性能;CallbackExecutor由CallbackExecutorProvider創建提供。

三、Plugin*Handler

在netty handlers一覽中介紹了很多plugin*handler;這些handler都是監聽netty的用戶自定義event來對callback進行回調

正戲

下來就通過mqtt的connect消息的整個調用處理流程來示例一下mqtt消息和事件處理。

貌似簡書不支持sequence。下面的請各自自行用markdown顯示即可。

MqttConnectHandler -> MqttConnectHandler: 當接受到connect消息時
MqttConnectHandler -> MqttConnectHandler:為pipeline添加MqttDisallowSecondConnect(請查看協議 MQTT-3.1.0-2)
MqttConnectHandler -> MqttConnectHandler:驗證clientid長度是否符合配置,否則發送ConnAck(REFUSED_IDENTIFIER_REJECTED)到client端
MqttConnectHandler -> MqttConnectHandler:刪除IdleStateHandler和NoConnectIdleEventHandler(連接建立后,必須在用戶配置時間內發送connect消息)
MqttConnectHandler --> PluginOnAuthenticationCallbackHandler:觸發PluginOnAuthentication事件,讓其調用callback進行認證
PluginOnAuthenticationCallbackHandler --> PluginOnAuthenticationCallbackHandler:異步遍歷所有OnAuthenticationCallback讓其認證,每一個callback認證完成會觸發一個PluginOnAuthenticationCallbackCompleted事件
PluginOnAuthenticationCallbackHandler --> PluginOnAuthenticationCallbackHandler:接收到PluginOnAuthenticationCallbackCompleted,根據用戶的插件認證配置決定下一步處理
PluginOnAuthenticationCallbackHandler --> MqttConnectHandler:當認證完成后會觸發PluginOnAuthenticationCompleted
MqttConnectHandler -> MqttConnectHandler:根據client端是否存在LWT,做LWT處理(此處不做過多描述,主要目的是描述流程)
MqttConnectHandler -> MqttConnectHandler:為pipeline添加:PluginAfterLoginCallbackHandler,做認證完成回調處理
MqttConnectHandler --> PluginAfterLoginCallbackHandler:觸發PluginAfterLogin事件,讓其調用callback進行認證完成結果的通知
MqttConnectHandler -> MqttConnectHandler:若認證不通過則發送ConAck(OnAuthenticationCallback返回的return code)到客戶端
MqttConnectHandler -> MqttConnectHandler:添加PluginRestrictionsCallbackHandler,為客戶端進行授權。
MqttConnectHandler --> PluginRestrictionsCallbackHandler:觸發PluginRestrictionsAfterLogin事件,讓其遍歷調用RestrictionsAfterLoginCallback,讓每個callback對客戶端進行授權
PluginRestrictionsCallbackHandler --> MqttConnectHandler:當每個授權都完成后,觸發PluginRestrictionsAfterLoginCompleted,將授權信息進行回傳
MqttConnectHandler --> MqttConnectHandler:為pipeline添加:PluginOnConnectCallbackHandler,讓其遍歷所有callback進行連接通知
PluginOnConnectCallbackHandler --> MqttConnectHandler:當所有OnConnectCallback回調完成,觸發PluginOnConnectCompleted事件
MqttConnectHandler -> MqttConnectHandler:處理掉與當前clientid一樣的連接
MqttConnectHandler -> ChannelPersistence:保存連接
MqttConnectHandler -> MqttConnectHandler:添加closeFuture,處理客戶端斷線
MqttConnectHandler --> MqttConnectPersistenceHandler:若客戶端持久session,則觸發持久session事件,讓MqttConnectPersistenceHandler處理持久session處理
MqttConnectHandler --> MqttConnectHandler:采集(統計)當前在線連接數增加
MqttConnectHandler --> MqttConnectHandler:添加closeFuture,采集(統計)當前在線連接數減少

流程較多,部分細節處理做了減免描述,為了讓大家更清晰地了解消息的處理、事件的處理、以及其相互之間的觸發方式,大家如果自己寫broker,沒必要生搬硬套按照這樣的步驟去處理(只要按照mqtt標準/建議的處理流程去處理即可),目的是為了大家了解其處理機制提供一個思路而已。


總結


1、所有的mqtt消息的handler與callbackhandler都是通過netty的自定義event來實現交互的,callbackhandler幾乎都是動態加入到pipeline中以減少內存的消耗。

2、所由callbackhandler都使用CallbackExecutor去異步調用callback,并監聽對應完成的event來進行交互。

由上可以看出,所有流程都是采用異步處理,同時限制Executor線程數來限制異步同時處理過多,使用netty自定義event來達到相互的交互、以及客戶端(plugin、mqtt client)感知的同步。


MQTT交流群:221405150

RocketMQ交流群:10648794

NewSQL交流群:153575008


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容