RabbitMQ配置
一般情况下默认的内置配置就可以有效运行RabbitMQ,大多数并不需要修改RabbitMQ的配置。当然为了有效的操控RabbitMQ,也可以利用调节系统范围的参数来达到定制化的需求。
RabbitMQ提供了三种方式来定制化服务:
- 环境变量:RabbitMQ服务端参数可以通过环境变量进行配置。
- 配置文件:可以定义RabbitMQ服务和插件设置。
- 运行时参数和策略:可以在运行时定义集群层面的服务设置。
环境变量
RabbitMQ的环境变量都是以‘RABBITMQ_’开头,可以在shell环境中设置,也可以在rabbitmq-env.conf这个RabbitMQ环境变量的定义文件中设置,优先级顺序按照shell环境最优先,其次rabbitmq-env.conf配置文件。
rabbitmq-env.conf这个文件(默认在$RABBITMQ_HOME/etc/rabbitmq/目录下,可以在启动RabbitMQ服务时指定RABBITMQ_CONF_ENV_FILE变量来设置文件的路径)
常见的RabbitMQ变量,这里包括但不仅限于这些变量:
- RABBITMQ_NODE_IP_ADDRESS: 绑定某个特定的网络接口。默认值是空,即绑定到所有网络接口上。
- RABBITMQ_NODE_PORT: 监听客户端的端口,默认5672
- RABBITMQ_DIST_PORT: RabbitMQ节点内部通信端口号,默认值为RABBITMQ_NODE_PORT+20000,即25672
- RABBITMQ_NODENAME: RabbitMQ的节点名称,默认为rabbit@$HOSTNAME
- RABBITMQ_CONF_ENV_FILE: RabbitMQ环境变量的配置文件(rabbitmq-env.conf)的地址,默认值为$RABBITMQ_HOME/etc/rabbitmq/rabbitmq-env.conf
- RABBITMQ_USE_LONGNAME: 如果当前的hostname为node1.longname,那么默认情况下创建的节点名称为rabbit@node1,将此值设置为true时,创建的节点的名称就为rabbit@node1.long
- RABBITMQ_CONFIG_FILE: RabbitMQ配置文件的rabbitmq.conf的路径,默认值为$RABBITMQ_HOME/etc/rabbitmq/rabbitmq
- RABBITMQ_MNESIA_BASE: RABBITMQ_MNESIA_DIR的父目录,默认$RABBITMQ_HOME/var/lib/rabbitmq/mnesia
- RABBITMQ_MNESIA_DIR: 包含RabbitMQ服务节点的数据库,数据存储及集群状态等目录,默认$RABBITMQ_MNESIA_BASE/$RABBITMQ_NODENAME
- RABBITMQ_LOG_BASE: RabbitMQ服务日志所在基础目录,默认$RABBITMQ_HOME/var/log/rabbitmq
- RABBITMQ_LOGS: RabbitMQ服务与Erlang相关的日志
- RABBITMQ_SASL_LOGS: RabbitMQ服务与Erlang的SASL相关的日志
- RABBITMQ_PLUGINS_DIR: 插件所在路径,默认值$RABBITMQ_HOME/plugins
配置文件
一个极简的rabbitmq.config文件配置如以下代码所示:
1 | [ |
2 | { |
3 | rabbit,[ |
4 | {tcp_listeners,[5673]} |
5 | ] |
6 | } |
7 | ]. |
RabbitMQ服务相关的大部分配置项。如无特殊需要,不建议修改,常见的配置如下:
- tcp_listeners: 用来监听AMQP连接(无SSL)。可以为端口号或者端口号与主机名组成的二元组。[{rabbit,[{tcp_listeners,[{“192.168.0.2”,5672}]}]}]
- num_tcp_acceptors: 用来处理tcp连接的erlang进程数,默认值为10
- handshake_timeout: AMQP握手(在socket连接和ssl握手之后)的超时时间,单位为毫秒
- ssl_listeners: 同tcp_listeners,用于ssl连接,默认值为[]
- num_ssl_acceptors: 用来处理ssl连接的erlang进程数目,默认值为1
- ssl_options: ssl配置,默认值为[]
- ssl_handshake_timeout: ssl的握手超时时间,默认值为5000
- vm_memory_high_watermark: 触发流量控制的内存阀值,默认值为0.4
- vm_memory_calculation_strategy: 内存使用的报告方式,有两种 1.rss系统rss内存报告 2.erlang内存报告
- vm_memory_high_watermark_paging_ratio: 内存高水位的百分比阀值,当达到阀值时,队列开始将消息持久化到磁盘以释放内存,这个需要配合vm_memory_high_watermark这个参数一起使用。默认0.5
- disk_free_limit: RabbitMQ存储数据分区的可用磁盘空间限制。当可用空间值低于阀值,流程控制将被触发。此值可根据RAM的相对大小来设置,默认情况下可用磁盘空间必须超过50MB,默认值是50000000
- log_levels: 控制日志的粒度,该值是日志事件类别和日志级别的二元组队列,目前定义4种日志类别:
1.channel:所有与AMQP信道相关的日志
2.connection:所有与连接相关的日志
3.federation:所有与federation相关的日志
4.mirroring:所有与镜像相关的日志
- frame_max: 与客户端协商的允许最大帧大小,单位为B,设置0表示无上限,默认值为131072
- channel_max: 与客户端协商的允许最大信道的个数,设置为0表示无上限。该数值越大,则Broker的内存使用就越高,默认值为0
- channel_operation_timeout:信道运行的超时时间,单位为毫秒(内部使用,因为消息协议的区别和限制,不暴露给客户端)。默认值为15000
- heartbeat: 服务器和客户端连接的心跳延迟,单位为秒。如果设置为0。如果设置为0,则禁用心跳。在有大量连接的情况下,禁用可以提高性能,但可能会导致一些异常,默认值60
- default_vhost: 设置默认的vhost。交换机amq.rabbitmq.log就在这个vhost上默认值为<<”/“>>
- default_user: 设置默认的用户。默认值为<<”guest”>>
- default_pass: 设置默认的密码。默认值为<<”guest”>>
- default_user_tags: 设置默认的角色。默认值为[administrator]
- default_permissions: 设置默认用户的权限。默认值为[<<”.*”>>,<<”.*”>>,<<”.*”>>]
- lookback_users: 设置只能通过本地网络来访问Broker的用户列表。如果希望通过默认的guest用户能够通过远程网络访问Broker,那么需要将这项设置为[],默认值<<”guest”>>
- cluster_nodes: 可以用来配置集群。这个值是一个二元组,二元组的第一个元素是想要与其建立集群关系的节点,第二个元素是节点的类型,要么是disc,要么是ram,默认值为{[],disc}
- server_properties: 连接时向客户端声明的键值对列表。默认值为[]
- management_db_cache_multiplier: 设置管理插件将缓存代价较高的查询的时间。缓存将把最后一个查询的运行时间乘以这个值,并在这个时间内缓存结果,默认值为5
- delegate_count: 内部集群通信中,委派进程的数目,默认值16
- tcp_listen_options: 默认的socket选项。默认值为:
[
{backlog,128},
{nodelay,true},
{linger,{true,0}},
{exit_on_close,false}
] - hipe_complie: 将此项设置为true就开启了hipe功能,即erlang即时编译,不是所有都支持。
- cluster_partition_handling: 如何处理网络分区。ignore;pause_minority;{pause_if_all_down,[nodes],ignore|autoheal};autoheal
- cluster_keepalive_interval: 向其他节点发送存活消息的频率。单位为毫秒,这个参数和net_ticktime参数不同,丢失存活消息并不会导致节点被认为已失效,默认值10000
- queue_index_embed_msg_below: 消息的大小小于此值时会被直接嵌入到队列的索引中,单位B,默认为4096
- msg_store_index_module: 队列索引的实现模块。默认值为rabbit_msg_store_ets_index
- backing_queue_module: 队列内容的实现模块。默认值为rabbit_variable_queue
- mnesia_table_loading_retry_limit: 等待集群中Mnesia数据表可用时最大的重试次数,默认值为10
- mnesia_table_loading_retry_timeout: 每次重试时,等待集群中的Mnesia数据表可用时的超时时间,默认值30000
- queue_master_locator: 队列的定位策略,即创建队列时以数目策略判断坐落的Broker节点,如果配置了镜像,则这里指master镜像的定位策略,可用策略:<<”min-masters”>>、<<”client-local”>>、<<”random”>>。默认值为<<”client-local”>>
- lazy_queue_explicit_gc_run_operation_threshold: 在使用惰性队列时进行内存回收动作的阀值,一个低的值会降低性能,一个高的值可以提高性能,但是更高的内存,默认值1000
- queue_explicit_gc_run_operation_threshold: 在使用正常队列时进行内存回收动作的阀值,一个低的值会降低性能,一个高的值可以提高性能,但是更高的内存,默认值1000
网络优化
当只有少量的客户端时,新建的连接分布时非常不均匀的,但是由于数量足够少,所以没有太大的差异,当连接数量到达数万或者更多时,重要的是确保服务器能够接受入站连接。
- rabbit.tcp_listen_options.nodelay: 但设置为true,可禁用Nagle算法。默认为true,对于多数用户而言,推荐为true
- rabbit.tcp_listen_options.sndbuf: 一般设置88k至128k,增大缓冲区可以提高消费者的吞吐量,同时增加内存使用。
- rabbit.tcp_listen_options.recbuf: 一般针对发送者或者协议操作
- rabbit.tcp_listen_options.backlog: 对列中未接受的最大数目,当达到此值时,新连接会被拒绝,对于成千上完的并发连接环境及可能存在大量客户端重新连接的场景,可设4096甚至更高
- rabbit.tcp_listen_options.linger: 当套接字关闭时,设置为{true,N},用于设置刷新未发送数据的超时时间,单位为秒
- rebbit.tcp_listen_options.keepalive: 当设置为true时,当启用tcp的存活时间,默认值为false。对于长时间空闲连接(至少10分钟)是有效的。