在上一篇文章中,我们介绍了Gmqtt的基本特性以及钩子函数的基本使用方法。本篇我们来详细介绍Gmqtt的插件机制,以及如何编写插件。
前文回顾Gmqtt——Go语言实现的MQTT broker
项目地址:https://github.com/DrmagicE/gmqtt
session的生命周期
根据MQTT协议规范,每个客户端连接都会有一个与之对应的session
,客户端可以指定该session
是否需要持久化。对于一个持久化session
,即使客户端离线,broker也会为其保留订阅信息以及与其订阅匹配的消息,当客户端重新上线后,broker会把这些消息投递给客户端。这使得在网络频繁闪断的环境下,也不会丢失消息。Gmqtt提供了钩子函数注入到session的生命周期中,使得插件可以管理session
生命周期的变化,涉及生命周期的钩子函数有:
- OnBasicAuth——收到
CONNECT
报文后调用,用作基本鉴权。 - OnEnhancedAuth——增强型鉴权(针对V5协议的支持)
- OnConnected——客户端连接成功
- OnSessionCreated——客户端新建session成功
- OnSessionResumed——客户端从session中恢复
- OnSessionTerminated——session终止
- OnClosed——客户
端断开
下面我们以基本鉴权为例,图解这些钩子函数在整个session生命周期中的位置。
session建立
session删除
非持久化session
会在连接关闭时删除,而对于持久化session
,一般会设置一个超时时间,当session
超时后,会被删除。
对于V3.1.1协议,客户端通过
CONNECT
报文的cleanSession
字段来控制session
是否需要持久化;
而在V5协议中,cleanSession
字段更名成为了cleanStart
字段,客户端通过设置超时时间来控制期望的session
的保留时间。
session
的删除过程如下图所示:
主题订阅/取消订阅流程
主题订阅和取消流程,涉及以下几个钩子函数:
- OnSubscribe——常用钩子函数之一,当收到
SUBSCRIBE
报文后触发,可用作权限控制,主题改写等功能。 - OnSubscribed——当成功订阅一个主题后触发。
- OnUnsubscribe——当收到
UNSUBSCRIBE
报文时触发。可用作权限控制,主题改写等功能。 - OnUnsubscribed——当取消订阅一个主题后触发。