事件交换插件
概述
客户端连接、队列、消费者以及系统的其他部分会生成事件。例如,当创建连接时,会发出 connection.created 事件。当连接关闭或失败时,会发出 connection.closed 事件。
监控和审计服务可能对观察这些事件感兴趣。RabbitMQ 有一个最小化的事件通知机制,可以通过 rabbitmq_event_exchange 插件暴露给 RabbitMQ 客户端。
该插件无需配置,只需激活即可
rabbitmq-plugins enable rabbitmq_event_exchange
消费内部事件
rabbitmq_event_exchange 是一个消费 RabbitMQ 内部事件并将其重新发布到名为 amq.rabbitmq.event 的主题交换机上的插件,从而将这些事件暴露给客户端应用程序。要消费事件,应用程序需要声明一个队列并将其绑定到 amq.rabbitmq.event 交换机。
默认情况下,该插件会在默认虚拟主机 (/) 中声明主题交换机 amq.rabbitmq.event。所有事件都会以路由键(主题)的形式发布到此交换机,例如 exchange.created、binding.deleted 等。因此,应用程序可以只消费相关的事件。例如,要订阅所有用户事件(如 user.created、user.authentication.failure 等),请创建一个路由(绑定)键为 user.# 的绑定。
该交换机的行为类似于 amq.rabbitmq.log:所有内容都会发布到那里。如果应用程序的用户不可信,不应允许他们对 amq.rabbitmq.event 交换机拥有读取访问权限,请禁止他们访问。
内部事件机制发布的所有消息正文始终为空。相关的事件属性在消息元数据中传递。
每个事件都有各种相关的事件属性。默认情况下,该插件内部发布 AMQP 0.9.1 消息,并将事件属性转换为 AMQP 0.9.1 消息头。通过在 rabbitmq.conf 中设置以下内容,该插件可以选择性地配置为内部发布 AMQP 1.0 消息,并将事件属性转换为 AMQP 1.0 消息注解:
event_exchange.protocol = amqp_1_0
内部事件机制发布的所有消息正文始终为空。相关的事件属性在消息元数据中传递。
由于该插件将事件属性设置为 AMQP 0.9.1 头或 AMQP 1.0 消息注解,客户端应用程序可以选择只订阅特定的事件属性(例如,为特定用户发出的所有事件)。这可以通过将队列绑定到头交换机,并将头交换机绑定到 amq.rabbitmq.event 主题交换机来实现。
插件配置
默认情况下,rabbitmq_event_exchange 插件使用以下配置
event_exchange.vhost = /
event_exchange.protocol = amqp_0_9_1
要将插件切换为以 AMQP 1.0 格式发布事件,请使用
event_exchange.vhost = /
event_exchange.protocol = amqp_1_0
使用指南
在大多数情况下,为用于消费这些事件的队列设置几千的最大长度限制可以防止不必要的资源使用。
事件交换插件通常用于审计内部事件。应用程序可以将其队列、流或一组队列(或流)绑定到此交换机并存储生成的事件历史记录。因此,此特殊交换机可以被视为一种结构化日志。
入站连接、连接断开、通道断开或队列断开的激增将产生大量事件。在内部事件队列上的消费者可能长时间缺席的环境中,队列可能会积累大量的积压。
在大多数情况下,为用于消费这些事件的队列设置几千的最大长度限制可以防止不必要的资源使用。
事件
此插件发布的事件及其路由键(主题)在此处有详细文档。
示例
有一个Java 内部事件消费者示例。