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 或通知后端,例如 amqp、rabbit、kafka 等。要指定并启用 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 及更高版本)引入了 Quorum 和 Stream 队列类型,它们将取代 classic HA 队列。
强烈建议您尽可能切换到 quorum 和 stream 队列,因为 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 部分中修改配置选项。