跳至主内容

插件开发基础

本指南涵盖了 RabbitMQ 插件开发的基础知识。在阅读本指南之前,建议读者对 RabbitMQ 的插件机制有基本的了解。

读者还应具备 ErlangOTP 设计原则 的基本知识。

Learn You Some Erlang 是开始学习 Erlang 和 OTP 的绝佳资源。

为什么要开发插件?

编写 RabbitMQ 插件可以带来许多吸引人的可能性:

  • 使您的应用程序能够访问未通过受支持协议暴露的 RabbitMQ 内部功能。
  • 在与代理相同的 Erlang 虚拟机(VM)中运行可以提高某些工作负载的性能。
  • 插件可以实现那些否则必须由系统中每个应用程序(服务)自行实现的功能,从而避免重复并减轻维护负担。

为什么不建议开发插件

与任何插件机制一样,在开发功能时应考虑将其作为插件嵌入是否是最合适的途径。以下是您可能不想将功能开发为插件的一些原因:

  • 依赖 RabbitMQ 内部 API 可能会导致您的应用程序在 RabbitMQ 发布新版本(包括补丁版本)时需要进行更改。如果您可以在不使用 RabbitMQ 内部结构的情况下完成所需的操作,那么您的应用程序将具有更好的前向兼容性。
  • 编写糟糕的插件可能导致整个节点不可用或运行异常。

入门

要开发 RabbitMQ 插件,请首先确保满足以下要求:

  • 确保您已成功安装 Git
  • 确保安装并配置好 服务器构建 指南中详述的依赖项。

Erlang.mk 用于构建 RabbitMQ 及其插件。开发新插件最简单的起点可能是复制一个现有的插件,例如rabbitmq-metronome如下例所示

开发期间激活插件

要在开发过程中测试插件,请使用以下 make 目标来启动一个 RabbitMQ 节点,其中包含从源码构建并已启用的本地插件:

make run-broker

插件质量建议

编写糟糕的插件可能会对代理的稳定性构成风险。为确保您的插件能够安全运行而不影响 RabbitMQ 核心,强烈建议遵循一些安全最佳实践。

  1. 始终为您的应用程序使用顶层监管者(supervisor)。
  2. 切勿直接启动插件应用程序,而应选择创建一个(哪怕是非常简单的)监管者,以防止 Erlang 虚拟机因顶层应用程序崩溃而关闭。

代理和依赖版本约束

可以使用插件应用程序环境中的 broker_version_requirements 键来指定插件对代理和依赖项的版本要求。要求以每个发行系列中的最低版本列表形式指定。请考虑以下示例:

{application, my_plugin,[
%% ...
{broker_version_requirements, ["3.11.15", "3.10.22"]}
]}

上述配置要求 RabbitMQ 3.10.x 版本至少为 3.10.22,3.11.x 版本至少为 3.11.15。请注意,当新的 RabbitMQ 主版本和次版本(功能版本)发布时,插件维护者有必要更新该列表

插件可以有依赖项。也可以为依赖项指定受支持的版本系列。这与上述内容非常相似,但使用的是类似字典的数据结构(proplist)。

例如:

{application, my_plugin, [
%% ...
{dependency_version_requirements, [{rabbitmq_management, ["3.11.0", "3.10.22"]}]}
]}

表示插件依赖于 3.10.x 系列中 3.10.22 及更高版本的 rabbitmq_management,以及 3.11.x 系列中的所有版本。

插件示例:Metronome(节拍器)

鉴于没有“Hello World”示例的开发指南是不完整的,以下尝试提供构建您自己的 RabbitMQ 插件的基础知识。

以下示例详述了如何构建一个像节拍器一样工作的简单插件。

它每秒向一个默认名为 metronome 的主题交换机(topic exchange)发送一条路由键格式为 yyyy.MM.dd.dow.hh.mm.ss 的消息。应用程序可以将队列绑定到该交换机,并使用各种路由键,以便按固定间隔被调用。例如,要每秒接收一条消息,可以应用 *.*.*.*.*.*.* 的绑定。要每分钟接收一条消息,则可以应用 *.*.*.*.*.*.00 的绑定。

GitHub 上的 rabbitmq-metronome 仓库包含此插件的源代码。

下表解释了仓库中各个文件的用途。

文件名目的
Makefile

此顶层 Makefile 定义了您的插件名称及其依赖项。名称必须与 Erlang 应用程序名称匹配。依赖项使用 erlang.mk 的变量声明。紧接着,Makefile 包含了rabbitmq-components.mkerlang.mk以及rabbitmq-plugins.mk,使用了 erlang.mk 的插件工具。有关这些文件的描述,请参阅下文。

erlang.mk

的一个本地副本。erlang.mk这不是一个纯净的副本,因为 RabbitMQ 依赖于一些尚未合并到上游的修改。这就是为什么ERLANG_MK_REPOERLANG_MK_COMMIT目前被重写的原因。

rabbitmq-components.mk

的一个本地副本。rabbitmq-components.mk。原始文件位于rabbitmq-common中,您的插件会自动依赖它。它包含其他 erlang.mk 扩展和辅助工具,必须在erlang.mk包含之前定义。此文件必须相对于rabbitmq-common保持最新:当它过时时,您会收到以下错误

error: rabbitmq-components.mk must be updated!

在这种情况下,只需运行以下命令来更新您的副本

make rabbitmq-components-mk
rabbitmq_metronome.schema

一个 Cuttlefish 配置模式。用于将 配置文件 转换为 RabbitMQ 及其运行时使用的内部格式。

Metronome 模式包含 metronome.exchange 设置的映射,用于设置插件使用的交换机。

启用插件后,配置将重新生成。如果插件未启用,配置中的插件特定值将导致错误。

有关编写模式文件的更多信息,请参阅 Cuttlefish 文档

src/rabbit_metronome.erl

Erlang “application” 行为的实现。为 Erlang 虚拟机提供启动和停止插件的途径。

src/rabbit_metronome_sup.erl

Erlang “supervisor” 行为的实现。监控工作进程,并在其崩溃时重启它。

src/rabbit_metronome_worker.erl

插件的核心。该工作进程将在内部连接到代理,然后创建一个每秒触发一次的任务。

test/metronome_SUITE.erl

插件的自动化测试。

开发流程

将您的插件克隆到 rabbitmq-server 仓库的 deps 目录中。

git clone https://github.com/rabbitmq/rabbitmq-server.git
cd rabbitmq-server
git clone https://github.com/user/my-rabbitmq-plugin.git deps/my_rabbitmq_plugin

运行 make 构建插件。

make -C deps/my_rabbitmq_plugin

要启动一个包含 my_rabbitmq_plugin 并启用 management 插件的节点:

make RABBITMQ_ENABLED_PLUGINS='rabbitmq_management my_rabbitmq_plugin' run-broker

要确保新插件已启动并运行,请运行以下命令:

rabbitmq-diagnostics status

如果您的插件加载成功,您应该会在已启用的插件列表中看到它。

# => Plugins
# =>
# => Enabled plugin file: /var/folders/gp/53t98z011678vk9rkcb_s6ph0000gn/T/rabbitmq-test-instances/rabbit@warp10/enabled_plugins
# => Enabled plugins:
# =>
# => * rabbitmq_metronome
# => * amqp_client
# => * my_rabbitmq_plugin

要运行 Common Test 测试套件,请使用:

make -C deps/my_rabbitmq_plugin tests

最后,您可以生成一个 .ez 文件,以便使用以下方式进行分发:

make -C deps/my_rabbitmq_plugin DIST_AS_EZS=yes dist

该文件出现在plugins目录下(位于仓库根目录中)。

© . This site is unofficial and not affiliated with VMware.