6 RabbitMQ 配置
6 RabbitMQ 配置
TIP
本小节主要介绍以下知识: 三种方式定制化服务
- 环境变量。例如:节点名称、RabbitMQ 配置文件的地址、节点内部通信端口等。
- 配置文件。可以定义 RabbitMQ 服务和插件设置,例如,TCP 监听端口,以及其他网络相关的设置、内存限制、磁盘限制等。
- 运行时参数和策略。可以在运行时定义集群层面的服务设置。
概述
一般情况下,可以使用默认的内建配置来有效地运行 RabbitMQ,并且大多数情况下也并不需要修改任何 RabbitMQ 的配置。
不同的操作系统和不同的 RabbitMQ 安装包,相应的配置会有所变化,包括相应的配置文件的地址等,使用时要尤为注意。
配置类的简要介绍下即可。
环境变量
需要关注的几个点如下:
- RabbitMQ 的环境变量都是以 “RABBITMQ_”开头的。
- 建议修改 rabbitmq-env.conf, 而不是修改 rabbitmq-defaults 文件来修改默认配置。
- 常见的 RabbitMQ 变量。
配置文件
需要关注的几个点如下:
- 查看 RabbitMQ 的服务日志,可以知道相应的配置是否生效。
- 查看进程信息的方式来检查配置文件的位置。通过
$ ps aux|grep rabbitmq
,如果 rabbitmq.conf 文件不处于默认的路径中,则会有 -config 选项标记正在使用的路径。
配置项
需要关注的几个点如下:
- 可以在 Web 页面的 node 上看到 config 文件的目录地址,3.9.11 版本该配置文件默认不存在。
- RabbitMQ 服务相关配置。参数很多。
配置加密
需要关注的几个点如下:
- 敏感数据加密。
- loopback_users 项配置为[],就可以使用非本地网络访问 RabbitMQ,如果开启了 RabbitMQ Management 插件,就可以使用 guest/guest的用户及密码来访问 Web 管理页面了。
- passphrase 项中的内容还可以使用单独文件来赋值。
- rabbitmqctl encode [--decode] 加解密
优化网络配置
需要关注的几个点如下:
- RabbitMQ 使用的 TCP/IP 协议通讯。
- 提高吞吐量。如金庸 Nagle算法(主要是减少延迟)、增大TCP缓冲区的大小(需要权衡和内存关系)。
- 线程池大小设置。
- 文件句柄数设置(合理权衡)。
- 通用的 TCP 套接字选项、一些可配置的内核选项
参数和策略
有些配置并不太适合在 rabbitmq.config 中去实现。如某项配置不需要同步到集群中的其他节点中,或者某项配置需要在运行时更改,因为 rabbitma.config 需要重启 Broker才能生效。 可以通过 rabbitmqctl 工具或者 HTTP API 接口来设置 Parameter。 RabbitMQ 一共有两种类型的 Parameter,两种类型都是 JSON 类型的。
- vhost:由组件名称、名称和值组成;
- global:由名称和值组成。
vhost 级别的参数对应的 rabbitmqctl 相关的命令有三种:set_parameter、list_parameter 和 clear_parameter。
设置一个参数
$ rabbitmqctl set_parameter [-p vhost] {component_name} {name} {value}
。列出指定虚拟主机上所有的 Parameter
$ rabbitmqctl list_parameters [-p vhost]
。清除指定的参数
$ rabbitmqctl clear_parameters [-p vhost] {component_name} {key}
。
与 rabbitmqctl 工具相对应的 HTTP API接口如下所述:
- 设置一个参数: PUT /api/parameters/{component_name}/vhost/name。
- 清除一个参数: DELETE /api/parameters/{component_name}/vhost/name。
- 列出指定 vhost 中的所有参数: GET /api/parameters。
gloable 级别 Parameter 的 set、clear 和 list 功能所对应的 rabbitmqctl 工具与 HTTP API 接口略。 创建交换器或者队列的时候可以配置一些可选的属性参数来获得一些不同的功能,比如 x-message-ttl、x-expires、x-max-length 等。通过客户端设定的这些属性参数一旦设置成功就不能再修改(不能修改也不能添加),除非删除原来的交换器或队列之后再重新创建新的。 Policy 的介入就可以很好的解决上述问题,它是一种特殊的 Parameter 的用法。Policy 是 vhost级别的,一个 Policy 可以匹配一个或者多个队列(或者交换器、或者两者兼有)这样便于批量管理。于此同时,Policy 也可以支持动态地修改一些属性参数,大大地提高了应用的灵活度。一般来说,Policy 用来配置 Federation、镜像、备份交换器、死信等功能。
rabbitmqctl_management 插件本身就提供了 Policy 的支持。可以再“Admin” -> “Policies” -> “Add/update a policy” 中添加一个 Policy。包含以下几个参数:
- Virtual host:表示当前 Policy 所在的 vhost 是哪个。
- Name:表示当前 Policy 的名称。
- Pattern:一个正则表达式,用来匹配相关的队列或者交换器。
- Apply to:用来指定当前 Policy 作用域哪一方。一共有三个选项-- “Exchanges and queues” 表示作用与 Pattern 所匹配的所有队列和交换器;“Exchanges”,“Queues”类比。
- Priority:定义优先级。如果有多个 Policy 作用域同一个交换器或者队列,那么 Priority 最大的那个 Policy 才会有用。
- Definition:定义一组或者多组键值对,为匹配的交换器或者队列附加相应的功能。
Policy 也有对应的 rabbitmqctl 工具和 HTTP API接口来操作,就不一一例举了。
参考文献
- [RabbitMQ实战指南]