RabbitMQ 配置

  RabbitMQ 提供了三种方式来定制化服务:
(1)环境变量(Enviroment Variables)。RabbitMQ 服务端参数可以通过环境变量进行配置,例如,节点名称、RabbitMQ 配置文件的地址、节点内部通信端口等。
(2)配置文件(Configuration File)。可以定义 RabbitMQ 服务和插件设置,例如,TCP 监听端口,以及其他网络相关的设置、内存限制、磁盘限制等。
(3)运行时参数和策略(Runtime Parameters and Policies)。可以在运行时定义集群层面的服务设置。
 

一、环境变量

  RabbitMQ 的环境变量都是以“RABBITMQ_”开头的,可以在 Shell 环境中设置,也可以在 rabbitmq-env.conf 这个 RabbitMQ 环境变量的定义文件中设置。优先级顺序按照 Shell 环境最优先,其次 rabbitmq-env.conf 配置文件,最后是默认的配置。

1. Shell 环境

  当采用 rabbitmq-server-detach 启动 RabbitMQ 服务的时候,此服务节点默认以“rabbit@”加上当前的 Shell 环境的 hostname(主机名)来命名,即 rabbit@$HOSTNAME。
  如果需要制定节点的名称,而不是采用默认的方式,可以在 rabbitmq-server 命令前添加RABBITMQ_NODENAME 变量来设定指定的名称。
示例:
RABBITMQ_NODENAME=rabbit@wjt rabbitmq-server-detached

2. 环境变量配置文件

  也可以通过环境变量配置文件 rabbitmq-env.conf 来定义,该文件默认在 $RABBITMQ_HOME/etc/rabbitmq/ 目录下,可以通过在启动 RabbitMQ 服务时指定 RABBITMQ_CONF_ENV_FILE 变量来设置此文件的路径。文件内容格式如下:

image

3. 默认配置

  对于默认的取值规则,这个在 $RABBITMQ_HOME/sbin/rabbitmq-defaults 文件中有相关设置:

image

  一般不建议在该文件中直接修改默认配置,而是通过环境变量配置文件 rabbitmq-env.conf 进行修改,覆盖默认配置。
 

二、配置文件

  RabbitMQ 默认的配置文件的位置取决于不同的操作系统和安装包。最有效的方法就是检查 RabbitMQ 的服务日志,在启动 RabbitMQ 服务的时候会打印相关信息。
  还可以通过查看进程信息的方式来检查配置文件的位置。通过 ps aux|grep rabbitmq 命令查看到 RabbitMQ 进程的信息,如果 rabbitmq.config 文件不处于默认的路径中,则会有 -config 选项标记正在使用的路径。
  一个极简的 rabbitmq.config 文件配置如以下代码所示(注意包含尾部的点号):

image

1. 配置加密

  配置文件中有一些敏感的配置项可以被加密,然后在 RabbitMQ 启动时可以对这些项进行解密。对这些项进行加密并不是意味着系统的安全性增强了,而是遵从一些必要的规范,让一些敏感的数据不会出现在文本形式的配置文件中。
  在配置文件中将加密之后的值以“{encrypted,加密的值}”形式包裹,比如下面的示例中使用口令“zzhpassphrase”将密码“guest”加密:

image

  这里将 loopback_users 项配置为[],就可以使用非本地网络访问 RabbitMQ 了,如果开启了 RabbitMQ Management 插件,就可以使用 guest/guest 的用户及密码来访问 Web 管理界面了。
  passphrase 项中的内容不一样要以硬编码的形式呈现,还可以使用单独文件来赋值,示例参考如下:

image

RabbitMQ 加密与解密:

image

或者通过 rabbitmqctl encode 命令设置:

image

2. 优化网络配置

  RabbitMQ 支持的所有协议都是基于 TCP 层面的。包括操作系统和 RabbitMQ 本身都提供了许多可调节的参数,除了操作系统内核参数和 DNS,所有的 RabbitMQ 设置都可以通过在 rabbitmq.config 配置文件中配置来实现。
(1)监听端口 rabbit.tcp_listeners
  默认情况下,RabbitMQ 会在所有可用的网络接口上监听 5672 端口。
在一个指定的 IP 地址和端口上进行监听:

image

同时监听 IPv4 和 IPv6 上监听:

image

(2)TCP 缓冲区大小 rabbit.tcp_listen_options.sndbuf & rabbit.tcp_listen_options.recbuf
  优化网络配置的一个重要目标就是提高吞吐量,比如禁用 Nagle 算法、增大 TCP 缓冲区的大小。每个 TCP 连接都分配了缓冲区。一般来说,缓冲区越大,吞吐量也会越高,但是每个连接上耗费的内存也就越多,从而使总体服务的内存增大,并发量减小,这是一个权衡的问题。在 Linux 操作系统中,默认会自动调节 TCP 缓冲区的大小,通常会设置为 80KB 到 120KB 之间。
下面的示例中将 TCP 缓冲区大小设置为 192KB:

image

(3)Erlang 线程池大小
  Erlang 在运行时使用线程池来异步执行 I/O 操作。线程池的大小可以通过 RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS 这个环境变量来调节。
示例:

image

  当机器的内核个数大于等于 8 时,建议将此值设置为大于等于 96,这样可以确保每个内核上可以运行大于等于 12 个 I/O 线程。注意这个值并不是越高越能提高吞吐量。
(4)禁用 Nagle 算法
  禁用 Nagle 算法可以提高吞吐量,但是其主要还是用于减少延迟。
  RabbitMQ 内部节点交互时可以在 kernel.inet_default_connect_options 和kernel.inet_default_listen_options 配置项中配置 {nodelay,true} 来禁用 Nagle 算法。rabbit.tcp_listen_options 也需要包含同样的配置,并且默认都是这样配置的,参考下面示例:

image

(5)未接受的 TCP 连接队列长度 rabbit.tcp_listen_options.backlog
  当连接数量到达数万或者更多时,重要的是确保服务器能够接受入站连接。未接受的 TCP 连接将会放在有长度限制的队列中。这个通过 rabbit.tcp_listen_options.backlog 参数来设置。默认值为128,当挂起的连接队列的长度超过此值时,连接将被操作系统拒绝。

image

  操作系统有关的网络设置也会影响到 RabbitMQ 的运行,理解这些设置选项同样至关重要。注意这一类型的内核参数在 /etc/sysctl.conf 文件(Linux 操作系统)中配置,而不是在 rabbitmq.config 这个文件中。

image

image

 

三、参数及策略

  RabbitMQ 绝大大多数的配置都可以通过修改 rabbitmq.config 配置文件来完成,但是其中有些配置并不太适合在 rabbitmq.config 中去实现。比如某项配置不需要同步到集群中的其他节点中,或者某项配置需要在运行时更改,因为 rabbitmq.config 需要重启 Broker 才能生效。这种类型的配置在 RabbitMQ 中的另一种称呼为参数(Parameter),也可以称之为运行时参数(Runtime Parameter)。
  Parameter 可以通过 rabbitmqctl 工具或者 RabbitMQ Management 插件提供的 HTTP API 接口来设置。RabbitMQ 中一共有两种类型的 Parameter:vhost 级别的 Parameter 和 global 级别的 Parameter。vhost 级别的 Parameter 由一个组件名称(component name)、名称(name)和值(value)组成,而 global 级别的参数由一个名称和值组成,不管是 vhost 级别还是 global 级别的参数,其所对应的值都是 JSON 类型的。

1. vhost 级别Parameter

(1)设置参数
rabbitmqctl set_parameter [-p vhost] {component_name} {name} {value}
对应的 HTTP API 接口:PUT /api/parameters/{componenet_name}/vhost/name
(2)查询参数列表
rabbitmqctl list_parameters [-p vhost]
对应的 HTTP API 接口:GET /api/parameters
(3)清除指定参数
rabbitmqctl clear_parameter [-p vhost] {componenet_name} {key}
对应的 HTTP API 接口:DELETE /api/parameters/{componenet_name}/vhost/name

2. global 级别 Parameter

image

3. Policy

  除了一些固定的参数(比如 durable 或者 exclusive),客户端在创建交换器或者队列的时候可以配置一些可选的属性参数来获得一些不同的功能,比如 x-message-ttl、x-expires、x-max-length 等。通过客户端设定的这些属性参数一旦设置成功就不能再改变(不能修改也不能添加),除非删除原来的交换器或队列之后再重新创建新的。
  Policy 的介入就可以很好的解决这类问题,它是一种特殊的 Parameter 的用法。Policy 是 vhost 级别的。一个 Policy 可以匹配一个或者多个队列(或者交换器,或者两者兼有),这样便于批量管理。与此同时,Policy 也可以支持动态地修改一些属性参数,大大地提高了应用的灵活度。
  rabbitmq_managemet 插件本身就提供了 Policy 的支持。
(1)通过 Web 管理页面操作

image

参数解析:
Virtual host:表示当前 Policy 所在的 vhost 是哪个。
Name:表示当前 Policy 的名称。
Pattern:一个正则表达式,用来匹配相关的队列或者交换器。
Apply to:用来指定当前Policy作用于哪一方。一共有三个选项——“Exchanges and queues”表示作用与 Pattern 所匹配的所有队列和交换器;“Exchanges”表示作用于与 Pattern 所匹配的所有交换器;“Queues”表示作用于与 Pattern 所匹配的所有队列。
Priority:定义优先级。如果有多个 Policy 作用于同一个交换器或者队列,那么 Priority 最大的那个 Policy 才会有用。
Definition:定义一组或者多组键值对,为匹配的交换器或者队列附加相应的功能。
(2)通过 rabbitmqctl 或 HTTP API 接口操作
添加:
rabbitmqctl set_policy [-p vhost] [--priority priority] [--apply-to apply-to] {name} {pattern} {definition}

image

image

查询列表:
rabbitmqctl list_policies [-p vhost]

image

image 

清除:
rabbitmqctl clear_policy [-p vhost] {name}

image

image

  如果两个或多个 Policy 都作用到同一个交换器或者队列上,且这些 Policy 的优先级都是一样的,则参数项最多的 Policy 具有决定权。如果参数一样多,则最后添加的 Policy 具有决定权。
 
 
 
 
参考:
《RabbitMQ实战指南》

 

posted @ 2025-08-04 23:22  疯一样的狼人  阅读(286)  评论(0)    收藏  举报