RabbitMq 驱动部署指南

介绍

RabbitMQ 驱动是 oslo.messaging 中的消息传输后端。该驱动将 oslo.messaging 的基础能力,用于通知消息交换,映射到 RabbitMQ 分布式消息代理。有关 RabbitMQ 服务器的更多详细信息,请访问 RabbitMQ 网站

摘要

RabbitMQ 驱动是 oslo.messaging 支持的消息传输后端。驱动程序与 RabbitMQ 服务器后端之间的通信使用 AMQP 0-9-1 协议(高级消息队列协议),这是一种开放的应用层,允许客户端应用程序以标准方式与消息中间件代理通信。AMQP 定义了从消息队列请求消息或将消息发布到交换的所有 API。RabbitMQ 驱动程序集成了 kombu python 客户端以提供完整的协议支持,并利用 Producer API 发布通知消息,并利用 Consumer API 进行通知监听器订阅。该驱动程序可以与单个 RabbitMQ 服务器实例或集群化的 RabbitMQ 服务器部署一起工作。

交换机

交换机是 AMQP 机制,它被设计成像一个代理包装一样分发消息。

消息总是发布到交换机。

交换机可以

  • 接收来自生产者的消息

  • 将消息推送到 队列

交换机可以使用称为绑定(bindings)的规则将消息副本分发到一个或多个队列。

AMQP 协议定义了不同类型的交换机

  • direct

  • topic

  • headers

  • fanout

交换机可以没有任何绑定。默认情况下,如果消息没有重定向到任何队列,则不会引发异常,除非使用了 mandatory 标志

oslo.messaging 允许您通过 Connection 类以相关的方式发送和消费消息。

使用 mandatory 标志,如果消息没有路由到任何队列,RabbitMQ 会引发回调。此回调将用于循环一段时间,并让发送者有机会恢复。

队列

The AMQP 队列 是消息存储,它可以将消息存储在内存中或将消息持久化到磁盘。

队列通过一个或多个绑定与交换机绑定。

消费者可以从队列中消费消息。

队列有名称,以便应用程序可以引用它们。

队列具有定义其行为的属性。

路由键

路由键是 AMQP 消息信封的一部分。路由键由生产者设置,用于路由发送的消息。当收到消息时,交换机将尝试将消息的路由键与绑定到它的所有队列的绑定键匹配。如果不存在匹配项,则消息将被忽略,否则消息将被路由到绑定键匹配的相应队列。

交换机类型

direct

直接交换机是一种根据消息路由键将消息路由到队列的交换机。消息将直接传递到与路由键对应的队列。direct 是一种交换机类型,因此 RabbitMQ 后端不存储数据。

topic

RabbitMQ topic 是一种 交换机类型。在 RabbitMQ 中,发送到 topic 交换机 的消息不能具有任意路由键 - 它必须是点分隔的单词列表。这些单词可以是任何内容,但通常它们指定与消息相关的某些特征。一些有效的路由键示例:“blue.orange.yellow”、“cars.bikes”、“quick.orange.rabbit”。路由键中的单词数量可以任意多,最多为 255 字节。在 oslo.messaging 中,通知监听器订阅一个主题,该主题由驱动程序直接映射到 RabbitMQ 主题。

fanout

扇出交换机将接收到的所有消息广播到它所知道的所有队列。

headers

Headers 交换机将使用消息头内容而不是使用之前描述的路由键来路由消息。在这种情况下,生产者会将消息头值作为键值对添加到消息中,并通过 headers 交换机发送。

交换机将尝试将接收到的消息的所有或任何(基于“x-match”的值)头值与绑定到它的所有队列的绑定值匹配。

交换机将使用“x-match”头条目的值来确定要用于匹配绑定队列的头。

如果未找到匹配项,则消息将被忽略,否则它将路由到绑定值匹配的队列。

使用心跳帧进行健康检查

oslo.messaging 的 RabbitMQ 驱动程序允许您使用心跳和 TCP keepalives 检测死 TCP 连接。驱动程序的心跳功能建立在 kombu 客户端的 heartbeat_check 功能 和 RabbitMQ 实现的 AMQP 0.9.1 心跳功能 之上。心跳是一种旨在撤消 TCP/IP 的一项功能,即仅在很长的时间后才关闭物理连接,从而从中断的物理连接中恢复。在某些情况下,我们需要快速知道对等方是否断开连接或由于其他原因未响应(例如,它正在循环)。由于心跳可以在较低级别完成,因此 AMQP 0.9.1 将其作为对等方在传输层交换的特殊类型的帧来实现,而不是作为类方法。心跳还可以防止某些网络设备在 TCP 连接上没有活动一段时间后终止“空闲”TCP 连接。驱动程序始终会在本机 python 线程中运行心跳,并避免从父进程继承执行模型,以避免使用绿色线程。

先决条件

为了运行驱动程序,必须安装 kombu python 客户端。RabbitMQ 驱动程序集成了基于 kombu 的 Python 客户端py-amqp 以提供完整的协议支持,并利用 Producer API 发布通知消息,并利用 Consumer API 进行通知监听器订阅。

通过 PyPI 提供 kombu 库 的源代码包。由于 RabbitMQ 驱动程序不是 oslo.messaging 的可选扩展,因此这些包默认安装。

配置

传输 URL 启用

oslo.messaging 中,transport_url 参数定义了 RPC 和通知的 OpenStack 服务后端。URL 的形式为

transport://user:pass@host1:port[,hostN:portN]/virtual_host

其中 transport 值指定 RPC 或通知后端,例如 amqprabbitkafka 等。要指定并启用 RabbitMQ 驱动程序进行通知,请在服务配置文件中的 [oslo_messaging_notifications] 部分中指定 transport_url 参数

[oslo_messaging_notifications]
transport_url = rabbit://username:password@kafkahostname:9092

请注意,如果在 [oslo_messaging_notifications] 部分中未指定 transport_url 参数,则将为 RPC 和通知后端使用 [DEFAULT] transport_url 选项。

关于 Quorum 和 Stream 队列的说明

最近的 RabbitMQ 版本(3.8 及更高版本)引入了 QuorumStream 队列类型,它们将取代 classic HA 队列。

强烈建议您尽可能切换到 quorumstream 队列,因为 classic HA 队列将被弃用。

推荐选项如下

[oslo_messaging_rabbit] rabbit_quorum_queue = True rabbit_transient_quorum_queue = True use_queue_manager = True rabbit_stream_fanout = True

驱动程序选项

建议使用 RabbitMQ 驱动程序提供的默认配置选项。可以在服务配置文件的 oslo_messaging_rabbit 部分中修改配置选项。

发布选项

消费选项

连接选项

心跳选项

安全选项