emqx-extension-hook 插件用于提供钩子(Hook)的多语言支持。它能够允许其他的语言,例如:Python,Java 等,能够直接表达如何挂载钩子,和处理相应的钩子事件。
该插件给 EMQ X 带来的扩展性十分的强大,甚至于所有基于钩子的插件都可以通过其他编程语言实现。唯一不同的是在性能上肯定有一定的降低。
目前,一些常见的场景有:
client.authenticate 钩子,使用其他编程语言查询数据库,判断该客户端是否具有接入的权限。client.check_acl 钩子,使用其他编程语言查询数据库,实现发布/订阅的权限控制逻辑。message 类的钩子,实现消息收发的控制和数据格式转换。声明:当前仅实现了 Python、Java 的支持
声明:message 类钩子功能仅包含在企业版当中
EMQ X 发行包中不包含其他语言的运行环境。它要求:
emqx-extension-hook 指示的路径。emqx-extension-hook 对其的搜索路径中。emqx-extension-hook 是 EMQ X 的一个插件,它主要包括:
其架构图如下:
EMQ X Third-party Runtimes
+========================+ +====================+
| Extension | | |
| +----------------+ | Hooks | Python scripts / |
| | Drivers | ------------------> | Java Classes / |
| +----------------+ | (pipe) | Others ... |
| | | |
+========================+ +====================+
图中表明,由 Client 产生的所有的事件,例如:连接、发布、订阅等,都会由 emqx-extension-hook插件分发给下面的各个 驱动(Driver);而,驱动则负责如何与三方运行时的进行通信。
广义上的驱动(Driver)可以分为两类:
emqx-extension-hook 并不关心驱动实际的类型和实现,只要其实现了对应的接口即可。
本文中,只有未经限定说明的驱动,都是指编程语言类的驱动。
编程语言类驱动是基于 Erlang - Port 进行实现。它本质上是由 emqx-extension-hook 是启动一个其他语言的程序,并使用管道(Pipe)实现两个进程间的通信。
此类驱动的实现包括两部分的内容:
如:
Erlang VM Third Runtimes (e.g: Java VM)
+===========+=========+ +=========+================+
| Extension | Driver | <=====> | Driver | User's Codes |
+===========+=========+ +=========+================+
而,对于基于服务的驱动,原理就很简单了。以 HTTP 为例,它的实现仅需要一个 HTTP 客户端、和指定服务端返回的数据格式即可。
参见 SDK 规范、和对应语言的开发手册