跳至主内容
版本:4.3

事件交换插件

概述

客户端连接、队列、消费者以及系统的其他部分都会产生事件。例如,当创建连接时,会发出 connection.created 事件。当连接关闭或失败时,会发出 connection.closed 事件。

监控和审计服务可能需要观察这些事件。RabbitMQ 提供了一种极简的事件通知机制,可以通过 rabbitmq_event_exchange 插件将其暴露给 RabbitMQ 客户端。

该插件无需配置,只需启用即可。

rabbitmq-plugins enable rabbitmq_event_exchange

消费内部事件

rabbitmq_event_exchange 是一个消费 RabbitMQ 内部事件并将其重新发布到名为 amq.rabbitmq.event主题交换机 (topic exchange) 的插件,从而将这些事件暴露给客户端应用程序。要消费这些事件,应用程序需要声明一个队列并将其绑定到 amq.rabbitmq.event 交换机。

默认情况下,该插件会在默认虚拟主机 (/) 中声明主题交换机 amq.rabbitmq.event。所有事件都会以路由键(主题)发布到此交换机,例如 exchange.createdbinding.deleted 等。因此,应用程序可以仅消费相关的事件。例如,要订阅所有用户事件(如 user.createduser.authentication.failure 等),请使用路由(绑定)键 user.# 创建绑定。

该交换机的行为类似于 amq.rabbitmq.log:所有内容都会发布到那里。如果应用程序的用户不可信,无法接触到所发布的事件,请不要允许他们对 amq.rabbitmq.event 交换机拥有 read(读取)权限。

重要

内部事件机制发布的所有消息体均为空。相关的事件属性包含在消息元数据中。

每个事件都关联有各种事件属性。默认情况下,插件在内部发布 AMQP 0.9.1 消息,并将事件属性转换为 AMQP 0.9.1 消息头。通过在 rabbitmq.conf 中进行如下设置,插件可以配置为在内部发布 AMQP 1.0 消息,并将事件属性转换为 AMQP 1.0 消息注解 (message-annotations)

event_exchange.protocol = amqp_1_0

内部事件机制发布的所有消息体均为空。相关的事件属性包含在消息元数据中。

由于该插件将事件属性设置为 AMQP 0.9.1 消息头或 AMQP 1.0 消息注解,客户端应用程序可以选择仅订阅特定的事件属性(例如,针对特定用户发出的所有事件)。这可以通过将队列绑定到头交换机 (headers exchange),并将该头交换机绑定到 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

使用指南

重要

在大多数情况下,为用于消费这些事件的队列设置几千条消息的最大长度限制,可以防止不必要的资源消耗。

事件交换机插件通常用于内部事件的审计。应用程序可以将一个队列、一个流 (stream) 或一组队列(或流)绑定到此交换机,并存储生成的事件历史记录。因此,这个特殊的交换机可以被视为一种结构化日志。

入站连接激增、连接抖动、通道抖动或队列抖动将产生大量事件。在内部事件队列上的消费者可能长时间缺席的环境中,队列可能会积压大量未处理的消息。

在大多数情况下,为用于消费这些事件的队列设置几千条消息的最大长度限制,可以防止不必要的资源消耗。

事件

该插件发布的事件及其路由键(主题)记录在此处

示例

这里有一个 Java 编写的内部事件消费者示例

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