路漫漫其修远兮
吾将上下而求索

rabbitmq学习:基础

使用场景

个人认为消息队列的主要特点是异步处理,主要目的是减少请求响应时间和解耦。所以主要的使用场景就是将比较耗时而且不需要即时(同步)返回结果的操作作为消息放入消息队列。同时由于使用了消息队列,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦和。

使用场景的话,举个例子:

假设用户在你的软件中注册,服务端收到用户的注册请求后,它会做这些操作:

1、校验用户名等信息,如果没问题会在数据库中添加一个用户记录

2、如果是用邮箱注册会给你发送一封注册成功的邮件,手机注册则会发送一条短信

3、分析用户的个人信息,以便将来向他推荐一些志同道合的人,或向那些人推荐他

4、发送给用户一个包含操作指南的系统通知

5、等等……

但是对于用户来说,注册功能实际只需要第一步,只要服务端将他的账户信息存到数据库中他便可以登录上去做他想做的事情了。至于其他的事情,非要在这一次请求中全部完成么?值得用户浪费时间等你处理这些对他来说无关紧要的事情么?所以实际当第一步做完后,服务端就可以把其他的操作放入对应的消息队列中然后马上返回用户结果,由消息队列异步的进行这些操作。

或者还有一种情况,同时有大量用户注册你的软件,再高并发情况下注册请求开始出现一些问题,例如邮件接口承受不住,或是分析信息时的大量计算使cpu满载,这将会出现虽然用户数据记录很快的添加到数据库中了,但是却卡在发邮件或分析信息时的情况,导致请求的响应时间大幅增长,甚至出现超时,这就有点不划算了。面对这种情况一般也是将这些操作放入消息队列(生产者消费者模型),消息队列慢慢的进行处理,同时可以很快的完成注册请求,不会影响用户使用其他功能。

所以在软件的正常功能开发中,并不需要去刻意的寻找消息队列的使用场景,而是当出现性能瓶颈时,去查看业务逻辑是否存在可以异步处理的耗时操作,如果存在的话便可以引入消息队列来解决。否则盲目的使用消息队列可能会增加维护和开发的成本却无法得到可观的性能提升,那就得不偿失了。

作者:ScienJus

链接:https://www.zhihu.com/question/34243607/answer/58314162

安装rabbitmq

RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License开源协议。

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。说的笼统点是queue+socket实现

我这里使用的是epel源里面的rabbimq-server包,如果需要更新版本的包,可以去参考文档里面找

yum install -y rabbitmq-server


配置RabbitMQ
在大多数系统上,一个节点应该能够启动并运行所有的默认值
生产环境配置后面再详解
注意:服务器设置为以系统用户rabbitmq运行 。如果更改节点数据库或日志的位置,则必须确保文件由该用户所有(并且还要更新环境变量)

端口访问
SELinux和类似的机制可能会阻止RabbitMQ绑定到一个端口。发生这种情况时,RabbitMQ将无法启动
防火墙可以防止节点和CLI工具相互通信。确保可以打开以下端口:
4369:epmd, RabbitMQ节点和CLI工具使用的对等发现服务
5672,5671:  由AMQP 0-9-1和1.0客户端使用
25672:     由Erlang分配用于节点间和CLI工具通信,并且从动态范围分配(AMQP端口+20000)
15672:     HTTP API客户端和rabbitmqadmin(仅当管理插件启用时)

默认的用户访问
默认将创建一个用户guest,密码guest。默认情况下,只有在以localhost身份连接到代理时才能使用这些凭证

调整系统限制
运行生产工作负载的RabbitMQ安装可能需要系统限制和内核参数调整,以便处理体面的并发连接和队列。需要调整的主要设置是打开文件的最大数量
echo "* soft nproc 65535" >> /etc/security/limits.conf
echo "* hard nproc 65535" >> /etc/security/limits.conf
echo "* soft nofile 655350" >> /etc/security/limits.conf
echo "* hard nofile 655350" >> /etc/security/limits.conf
echo "ulimit -u 65535" >> /etc/profile
echo "ulimit -n 655350" >> /etc/profile


修改rabbitmq配置
    修改/etc/systemd/system/multi-user.target.wants/rabbitmq-server.service
    在[Service]中,增加LimitNOFILE=30000(具体数值根据需要)
执行systemctl daemon-reload
重启rabbitmq服务
rabbitmqctl status
 

日志
默认的情况下,日志位于/var/log/rabbitmq目录中,服务器的输出被发送到RABBITMQ_NODENAME.log文件 。其他日志数据写入RABBITMQ_NODENAME-sasl.log

rabbitmq自带管理后台,安装后需要配置开启

进入rabbitmq安装目录中的sbin目录执行
查看rabbitmq-plugins执行文件安装目录:rpm -ql rabbitmq-server
/usr/lib/rabbitmq/bin/rabbitmq-plugins list
/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management
生效的插件会记录在:/etc/rabbitmq/enabled_plugins 文件当中 
修改了配置,重启服务生效
service rabbitmq-server restart
打开http://localhost:15672/即可看到管理后台
 
用户名密码均为guest

另外的总结

程序包:
    epel;rabbitmq-server
        插件:rabbitmq-plugins {enable|disable|list}
        rabbitmq_management,监听在15672端口

安装:yi rabbitmq-server
    rpm -ql rabbitmq-server
    
    /usr/lib/rabbitmq/bin/rabbitmq-plugins list 
    rabbitmq-plugins enable rabbitmq_management   使能的组件是E表示。依赖哪些组件,使用e表示,
    启用插件后,要重新启动服务,有些插件会监听端口
    systemctl restart rabbitmq-server
    访问web管理:http://ip:15672   guest guest
    端口:25672是集群通信  15672是管理界面 5672是amqp

配置方式
    环境变量:网络参数及配置文件路径
    配置文件:服务器各组件访问权限,资源限制,插件及集群
    运行时参数:集群的运行时参数设定
    
    环境变量:/etc/rabbitmq/rabbitmq-env.conf
        RABBITMQ_BASE:数据库和日志文件存放位置
        RABBITMQ_CONFIG_FILE:配置文件路径; /etc/rabbitmq/rabbitmq
        RABBITMQ_LOGS:日志
        RABBITMQ_NODE_IP_ADDRESS:监听的ip
        RABBITMQ_NODE_PORT:
        RABBITMQ_PLUGINS_DIR:
        
    配置文件:
        auth_mechanisms:认证机制
        default_user:guest
        default_pass:guest
        default_permission:
        disk_free_limit: 磁盘预留空间
        heartbeat:消息时长
        hipe_compile:使用默认编译器还是高级编译器
        log_levels:{none|error|warning|info}
        tcp_listeners:监听的地址和端口
        ssl_listeners:基于ssl通信监听的地址和端口
        vm_memory_high_watermark:
    
    运行时参数:rabbitmqctl -h
        rabbitmqctl status
        set_parameter [-p <vhostpath>] <component_name> <name> <value>
        clear_parameter [-p <vhostpath>] <component_name> <key>
        list_parameters [-p <vhostpath>]
        
        设置清除参数
        set_policy [-p <vhostpath>] <name> <pattern>  <definition> [<priority>] 
        clear_policy [-p <vhostpath>] <name>
        list_policies [-p <vhostpath>]

        set_vm_memory_high_watermark <fraction>

        stop [<pid_file>]
        stop_app  停止所有应用
        start_app  启动所有应用

        add_user <username> <password>
        delete_user <username>
        change_password <username> <newpassword>
        clear_password <username>
        set_user_tags <username> <tag> ...       例:rabbitmqctl set_user_tags test administrator
        list_users
        
        设定哪个用户对哪个虚拟主机有哪些权限
        add_vhost <vhostpath>   例:rabbitmqctl add_vhost /myhost/test1   
        delete_vhost <vhostpath>
        list_vhosts [<vhostinfoitem> ...]
        set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
        clear_permissions [-p <vhostpath>] <username>
        list_permissions [-p <vhostpath>]
        list_user_permissions <username>

            rabbitmqctl set_permissions -p /myhost/test test '.*' '.*' '.*'
            Setting permissions for user "test" in vhost "/myhost/test" ...
            ...done.

            rabbitmqctl list_permissions -p /myhost/test
            Listing permissions in vhost "/myhost/test" ...
            test    .*  .*  .*
            ...done.

        组件查看
        list_queues [-p <vhostpath>] [<queueinfoitem> ...]
        list_exchanges [-p <vhostpath>] [<exchangeinfoitem> ...]
        list_bindings [-p <vhostpath>] [<bindinginfoitem> ...]
        list_connections [<connectioninfoitem> ...]
        list_channels [<channelinfoitem> ...]
        list_consumers [-p <vhostpath>]

        broker状态查看
        status
        
        环境变量查看
        environment
        
        关闭指定连接
        close_connection <connectionpid> <explanation>
            
        内存使用
        set_vm_memory_high_watermark <fraction>

虚拟主机vhost

每一个RabbitMQ服务器都能创建虚拟消息服务器,我们称之为虚拟主机。每一个vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的交换机、队列、绑定等,拥有自己的权限机制。vhost之于Rabbit就像虚拟机之于物理机一样。他们通过在各个实例间提供逻辑上分离,允许为不同的应用程序安全保密的运行数据,这很有,它既能将同一个Rabbit的众多客户区分开来,又可以避免队列和交换器的命名冲突。RabbitMQ提供了开箱即用的默认的虚拟主机“/”,如果不需要多个vhost可以直接使用这个默认的vhost,通过使用缺省的guest用户名和guest密码来访问默认的vhost。

vhost之间是相互独立的,这避免了各种命名的冲突,就像App中的沙盒的概念一样,每个沙盒是相互独立的,且只能访问自己的沙盒,以保证非法访问别的沙盒带来的安全隐患。

虚拟主机操作

列举所有虚拟主机 rabbitmqctl list_vhosts
添加虚拟主机 rabbitmqctl add_vhost <vhost_name>
删除虚拟主机rabbitmqctl delete_vhost <vhost_name>
添加用户 add_user <username> <password>
设置用户标签 set_user_tags <username> <tag> // 设置这个才能在页面上登录,tag可以为administrator, monitoring, management
设置权限 set_permissions [-p <vhost>] <user> <conf> <write> <read> 
权限配置包括:配置(队列和交换机的创建和删除)、写(发布消息)、读(有关消息的任何操作,包括清除这个队列) 
conf:一个正则表达式match哪些配置资源能够被该用户访问。 
write:一个正则表达式match哪些配置资源能够被该用户读。 
read:一个正则表达式match哪些配置资源能够被该用户访问

生产环境部署注意

像RabbitMQ这样的数据服务通常有许多可调参数。一些配置对开发有很大的意义,但并不适合生产,本指南旨在为此提供帮助

虚拟主机
例如,在单租户环境中,当您的RabbitMQ集群专门为生产中的单个系统供电时,使用默认的虚拟主机(/)是完全正确的
在多租户环境中,为每个租户/环境使用单独的虚拟主机,例如project1_development, project1_production,project2_development和  project2_production等


用户
对于生产环境,请删除默认用户(guest),默认用户只能从本地主机默认连接,因为它具有众所周知的凭据。不要启用远程连接,而应考虑使用具有管理权限和生成密码的单独用户
建议每个应用程序使用一个单独的用户。例如,如果您有一个移动应用程序,一个Web应用程序和一个数据聚合系统,您将有3个独立的用户。这使得许多事情更容易:将客户端连接与应用程序关联


权限控制
认证和授权通常会混淆或互换使用。这是错误的,在RabbitMQ中,两者是分开的。为了简单起见,我们将认证定义为“标识用户是谁”,授权定义为“确定用户是什么,不允许做什么”
默认的虚拟主机和用户
  当服务器首次开始运行,并检测到其数据库未初始化或被删除时,它将使用一下资源初始化一个新的数据库
  一个名为 /虚拟主机
  一个名为guest的用户,默认密码为guest,被授予对/虚拟主机的完全访问权限
  明智的做法是删除guest用户或更改密码,特别是在公共网络上访问
  默认情况下guest用户被禁止远程连接到代理,它只能通过localhost连接。我们创建的其他用户默认情况下没有这种限制
  如果我们希望允许guest用户从远程主机连接,则应将loopback_users配置设置 为  none,如下:

loopback_users = none
权限如何工作

当一个RabbitMQ客户端建立到一个服务器的连接时,它指定了一个虚拟主机。此时执行第一级访问控制,服务器检查用户是否有权访问虚拟主机,否则拒绝连接尝试
资源(即交换和队列)在特定虚拟主机内被命名为实体;当对资源执行某些操作时,强制执行第二级访问控制

RabbitMQ在资源上有配置、写入、读取操作
                配置:创建或销毁资源,或更改其行为
                写: 写入消息到资源
                读: 检索资源的消息
 

内存
默认情况下,当RabbitMQ检测到使用的内存超过40%(由操作系统报告)时,将不会接收任何消息:{vm_memory_high_watermark,0.4},这是一个安全的默认值
在修改此值应该小心,即使主机是专用的RabbitMQ节点,因为如果没有足够的空闲系统内存,将会对操作系统交换造成不利影响,甚至会导致RabbitMQ进程终止
调整默认vm_memory_high_watermark时的一些建议
  托管RabbitMQ的节点应始终具有至少128MB的可用内存
  推荐的vm_memory_high_watermark范围是  0.40到0.66
  值不要超过0.7。操作系统和文件系统必须至少保留30%的内存,否则性能可能因寻呼而严重降级
比如修改配置调整为0.6,编辑rabbitmq.conf
vm_memory_high_watermark.relative = 0.6

磁盘空间
disk_free_limit默认值是50MB
  {disk_free_limit,{mem_relative,1.0}}是最小推荐值,和内存的容量一样大
  例如,在专用于具有4GB系统内存的RabbitMQ的主机上,如果可用磁盘空间低于4GB,所有发布者将被阻止,并且不会接收新消息。队列将需要被排空,通常由消费者,在发布之前将被允许恢复
  {disk_free_limit,{mem_relative,1.5}}是一个更安全的产品价值
  在具有4GB内存的RabbitMQ节点上,如果可用磁盘空间低于6GB,则所有新消息都将被阻止,直到磁盘警报清除
{disk_free_limit,{mem_relative,2.0}}是最保守的产品价值,我们想不出任何理由使用更高的产品。如果您希望RabbitMQ拥有所有需要的磁盘空间,编辑rabbitmq.conf,比如修改配置调整为2G

disk_free_limit.absolute = 2GB

打开文件句柄限制
保证您的环境至少允许有效的RabbitMQ用户使用至少50K的开放文件描述符,包括在开发环境中


监控
强烈建议监视系统的几个方面,从基础架构和内核度量到RabbitMQ到应用程序级度量。虽然监控需要在时间上进行前期投资,但在提前(或根本)解决问题方面非常有效。
参考zabbix监控(http://blog.thomasvandoren.com/monitoring-rabbitmq-queues-with-zabbix.html)
https://github.com/jasonmcintosh/rabbitmq-zabbix


日志收集
强烈建议所有RabbitMQ节点和应用程序(如果可能的话)的日志都被收集和汇总。日志对于调查不寻常的系统行为至关重要


节点时间同步
节点时间同步


网络配置
TCP侦听器配置接口和端口

listeners.tcp.1 = 192.168.1.99:5672
将RabbitMQ配置为仅在IPv4和IPv6上的本地主机上侦听(双协议)

listeners.tcp.1 = 127.0.0.1:5672
listeners.tcp.2 = :: 1:5672
TCP缓冲区大小

这是关键的可调参数之一。每个TCP连接都有为其分配的缓冲区。一般来说,这些缓冲区越大,每个连接使用的内存就越多,吞吐量越好
在Linux系统上,操作系统默认会自动调整TCP缓冲区大小,通常在80-120KB之间
可以使用rabbit.tcp_listen_options, rabbitmq_mqtt.tcp_listen_options,  rabbitmq_amqp1_0.tcp_listen_options和相关的配置项来增加缓冲区大小
以下示例将AMQP 0-9-1连接的TCP缓冲区设置为192 KiB(请注意,将发送和接收缓冲区大小设置为不同的值是危险的,不推荐使用):即每个连接使用的RAM
tcp_listen_options.backlog = 128
tcp_listen_options.nodelay = true
tcp_listen_options.linger.on = true
tcp_listen_options.linger.timeout = 0
tcp_listen_options.sndbuf = 196608 
tcp_listen_options.recbuf = 196608
有些环境中每个节点持续并发连接数量比吞吐量更重要,因此需要为每个工作负载找到吞吐量和每个连接的RAM使用量之间的最佳值,不建议低于8K

连接握手超时
RabbitMQ的连接握手超时,默认10秒。当客户端运行在严重受限的环境中时,可能需要增加超时。这可以通过rabbit.handshake_timeout(毫秒)完成:
handshake_timeout = 20000

OS级调整
fs.file-MAX                     内核将分配的最大文件数量
net.ipv4.ip_local_port_range    本地IP端口范围,定义为一对值。范围必须为并发连接的峰值数量提供足够的条目
net.ipv4.tcp_tw_reuse           启用时,允许内核在TIME_WAIT 状态下重新使用套接字
net.ipv4.tcp_fin_timeout        将此值降低到5-10会减少关闭连接保持TIME_WAIT状态的时间。推荐用于预计大量并发连接的情况。
net.core.somaxconn              侦听队列的大小(同时建立多少个连接)。默认值是128.增加到4096或更高,以支持入站连接突发,例如,当客户端重新连接时
net.ipv4.tcp_max_syn_backlog    记录的连接请求的最大数量尚未从连接客户端收到确认。默认值为128,最大值为65535.当优化吞吐量时,建议使用4096和8192开始值
net.ipv4.conf.default.rp_filter 启用反向路径过滤。如果IP地址欺骗 不是您的系统所关心的,请将其禁用
 
tcp_listen_options.nodelay      设置为true时,禁用 Nagle的算法。默认是真的。强烈建议大多数用户
tcp_listen_options.sndbuf       默认值由OS自动调整,通常在现代Linux版本的88 KiB至128 KiB范围内。增加缓冲区大小可提高每个连接的消费者吞吐量和RAM使用量。减少有相反的效果
tcp_listen_options.recbuf       默认值的效果与rabbit.tcp_listen_options.sndbuf类似,但是对于发布者和协议操作来说一般
tcp_listen_options.backlog      未接受的TCP连接队列的最大大小。达到这个尺寸时,新的连接将被拒绝。对于具有数千个并发连接和可能的批量客户端重新连接的环境,设置为4096或更高
tcp_listen_options.keepalive    当设置为true时,启用TCP保持活动(见上文)。默认是false。对于连接可以长时间闲置(至少10分钟)的环境有意义,但仍然建议使用心跳
 
TCP Keepalives
    net.ipv4.tcp_keepalive_time = 60
    net.ipv4.tcp_keepalive_intvl = 15
    net.ipv4.tcp_keepalive_probes = 4
    TCP包含一个类似于心跳(aka keepalive)的机制,在消息传递协议和上面的网络核对超时(TCP tickal timeout)中包含TCP保持活动。由于默认设置不足,TCP Keepalive通常不会按照
    预期的方式工作:需要很长时间(例如,一个小时或更长时间)才能检测到死亡的对等方。但是,通过调整,它们可以达到与心跳相同的目的,并且有意或无意地清除陈旧的TCP连接,例如
    选择不使用心跳的客户端。下面是TCP keepalive的sysctl配置示例,它认为TCP连接在120秒后死机或不可达(连接空闲60秒后每15秒4次尝试):
    在RabbitMQ操作员无法控制应用程序设置或使用的客户端库的环境中,TCP Keepalive可以成为有用的附加防御机制。
分区处理策略

在投入生产之前 选择分区处理策略非常重要
强烈建议不要在网络分区的环境中部署RabbitMQ集群

配置文件rabbitmq.config详解

默认rabbitmq.conf配置文件是没有的,如果我们想自定义一些配置,可以创建/etc/rabbitmq/rabbitmq.conf,修改后的配置会覆盖内置的配置

官方的配置文件说明:http://www.rabbitmq.com/configure.html

##相关文档指南:http://rabbitmq.com/configure.html。看到

## 联网
## ====================
##
##相关文档指南:http://rabbitmq.com/networking.html。
##
##默认情况下,RabbitMQ将使用侦听所有接口
##标准(保留)AMQP 0-9-1和1.0端口。
##
#listeners.tcp.default = 5672
 
 
##要监听特定的接口,请提供带有端口的IP地址。
##例如,只在本地主机上侦听IPv4和IPv6:
##
#IPv4
#listeners.tcp.local = 127.0.0.1:5672
#IPv6
#listeners.tcp.local_v6 = :: 1:5672
 
##您可以使用侦听器名称定义多个侦听器
#listeners.tcp.other_port = 5673
#listeners.tcp.other_ip = 10.10.10.10:5672
 
 
## TLS监听器的配置方式与TCP监听器相同,
##包括控制界面选择的选项。
##
#listeners.ssl.default = 5671
 
##将接受TCP连接的Erlang进程的数量
##和TLS监听器。
##
#num_acceptors.tcp = 10
#num_acceptors.ssl = 1
 
 
## AMQP 0-8 / 0-9 / 0-9-1握手的最大时间(套接字连接后)
##和TLS握手),以毫秒为单位。
##
#handshake_timeout = 10000
 
##设置为'true'在接受a时执行反向DNS查询
##连接。主机名将被显示,而不是IP地址
#在rabbitmqctl中的##和管理插件。
##
#reverse_dns_lookups = true
 
##
##安全,访问控制
## ==============
##
 
##相关文档指南:http://rabbitmq.com/access-control.html。
 
##默认的“访客”用户只能访问服务器
##通过一个回送接口(例如本地主机)。
## {loopback_users,[<<“guest”>>]},
##
#loopback_users.guest = true
 
##如果您想允许访问,请取消注释以下行
##来宾用户从网络上的任何地方。
#loopback_users.guest = false
 
## TLS配置。
##
##相关文档指南:http://rabbitmq.com/ssl.html。
##
#ssl_options.verify = verify_peer
#ssl_options.fail_if_no_peer_cert = false
#ssl_options.cacertfile = /path/to/cacert.pem
#ssl_options.certfile = /path/to/cert.pem
#ssl_options.keyfile = /path/to/key.pem
 
##选择要使用的认证/授权后端。
##
##备用后端由插件提供,例如rabbitmq-auth-backend-ldap。
##
##注意:这些设置需要启用某些插件。
##
##相关文档指南:
##
## * http://rabbitmq.com/plugins.html
## * http://rabbitmq.com/access-control.html
##
 
#auth_backends.1 = rabbit_auth_backend_internal
 
##使用单独的后端进行身份验证和授权,
## 见下文。
#auth_backends.1.authn = rabbit_auth_backend_ldap
#auth_backends.1.authz = rabbit_auth_backend_internal
 
## rabbitmq_auth_backend_ldap插件允许经纪人
##通过推迟到一个执行认证和授权
##外部LDAP服务器。
##
##相关文档指南:
##
## * http://rabbitmq.com/ldap.html
## * http://rabbitmq.com/access-control.html
##
##使用LDAP进行身份验证和授权
#auth_backends.1 = rabbit_auth_backend_ldap
 
##使用HTTP服务进行身份验证和
##授权
#auth_backends.1 = rabbit_auth_backend_http
 
##在链中使用两个后端:首先是HTTP,然后是内部
#auth_backends.1 = rabbit_auth_backend_http
#auth_backends.2 = rabbit_auth_backend_internal
 
##认证
##内置的机制是“普通”,
##'AMQPLAIN'和'EXTERNAL'可以通过添加其他机制
##插件。
##
##相关文档指南:http://rabbitmq.com/authentication.html。
##
#auth_mechanisms.1 = PLAIN
#auth_mechanisms.2 = AMQPLAIN
 
## rabbitmq-auth-mechanism-ssl插件使得它成为可能
##根据客户端的x509(TLS)证书对用户进行身份验证。
##相关文档指南:http://rabbitmq.com/authentication.html。
##
##要使用auth-mechanism-ssl,EXTERNAL机制应该
##被启用:
##
#auth_mechanisms.1 = PLAIN
#auth_mechanisms.2 = AMQPLAIN
#auth_mechanisms.3 = EXTERNAL
 
##要强制所有客户端上基于x509证书的身份验证,
##排除所有其他机制(注意:这将禁用基于密码的
##认证甚至管理用户界面!):
##
#auth_mechanisms.1 = EXTERNAL
 
##这涉及rabbitmq-auth-mechanism-ssl插件和
## STOMP ssl_cert_login配置。查看RabbitMQ STOMP插件
##  稍后在此文件和README中的##配置部分
## https://github.com/rabbitmq/rabbitmq-auth-mechanism-ssl进一步
## 细节。
##
##使用TLS证书的CN而不是DN作为用户名
##
#ssl_cert_login_from = common_name
 
## TLS握手超时,以毫秒为单位。
##
#ssl_handshake_timeout = 5000
 
 
##密码散列实现。只会影响新的
##创建用户。重新计算现有用户的散列值
##有必要更新她的密码。
##
##要使用SHA-512,请设置为rabbit_password_hashing_sha512。
##
#password_hashing_module = rabbit_password_hashing_sha256
 
##导入从早期版本导出的定义
##比3.6.0,有可能回到MD5(只做这个
##作为临时措施!)通过将其设置为rabbit_password_hashing_md5。
##
#password_hashing_module = rabbit_password_hashing_md5
 
##
##默认用户/ VHost
## ====================
##
 
##首先启动RabbitMQ将创建一个虚拟主机和一个用户。这些
## config items控制创建的内容。
##相关文档指南:http://rabbitmq.com/access-control.html
##
#default_vhost = /
#default_user = guest
#default_pass = guest
 
#default_permissions.configure =。*
#default_permissions.read =。*
#default_permissions.write =。*
 
##默认用户的标签
##
##有关标签的更多详细信息,请参阅文档
##管理插件在http://rabbitmq.com/management.html。
##
#default_user_tags.administrator = true
 
##定义这样的其他标签:
#default_user_tags.management = true
#default_user_tags.custom_tag = true
 
##
##其他网络和协议相关的配置
## ================================================ =====
##
 
##设置默认的AMQP 0-9-1心跳间隔(以秒为单位)。
##相关文档指南:
##
## * http://rabbitmq.com/heartbeats.html
## * http://rabbitmq.com/networking.html
##
#心跳= 600
 
##设置AMQP帧的最大允许大小(以字节为单位)。
##
#frame_max = 131072
 
##设置连接前服务器将接受的最大帧大小
##调整发生
##
#initial_frame_max = 4096
 
##设置每个连接的最大允许通道数量。
## 0的意思是“没有限制”。
##
#channel_max = 128
 
##自定义TCP监听器(套接字)配置。
##
##相关文档指南:
##
## * http://rabbitmq.com/networking.html
## * http://www.erlang.org/doc/man/inet.html#setopts-2
##
 
#tcp_listen_options.backlog = 128
#tcp_listen_options.nodelay = true
#tcp_listen_options.exit_on_close = false
 
##
##资源限制和流量控制
## ==============================
##
##相关文档指南:http://rabbitmq.com/memory.html。
 
##基于内存的流量控制阈值。
##
#vm_memory_high_watermark.relative = 0.4
 
##或者,我们可以设置节点使用的RAM的限制(以字节为单位)。
##
#vm_memory_high_watermark.absolute = 1073741824
 
##或者您可以使用内存单位设置绝对值(使用RabbitMQ 3.6.0+)。
##如果相对定义,绝对水印将被忽略!
##
#vm_memory_high_watermark.absolute = 2GB
##
##支持的单位后缀:
##
## kb,KB:kibibytes(2 ^ 10个字节)
## mb,MB:mebibytes(2 ^ 20)
## gb,GB:gibibytes(2 ^ 30)
 
 
 
##队列开始的高水印限制的分数
##寻呼消息到光盘为了释放内存。
##例如,当vm_memory_high_watermark被设置为0.4并且该值被设置为0.5时,
##分页可以在节点使用总可用RAM的20%时开始。
##
##大于1.0的值可能是危险的,应谨慎使用。
##
##一个替代方案是使用持久队列和发布消息
##作为永久(交付模式= 2)。有了这个组合队列将
##将消息更快地移动到磁盘。
##
##另一种选择是配置队列来寻呼所有消息(都是
##持久性和瞬态)到磁盘
##尽可能参见http://rabbitmq.com/lazy-queues.html。
##
#vm_memory_high_watermark_paging_ratio = 0.5
 
##选择Erlang VM内存消耗计算策略。可以是“分配”,“rss”或“legacy”(别名为“erlang”),
##在3.6.11中介绍。“rss”是3.6.12的默认值。
##查看https://github.com/rabbitmq/rabbitmq-server/issues/1223和rabbitmq / rabbitmq-common#224获取背景信息。
#vm_memory_calculation_strategy = rss
 
##我们执行内存检查的间隔(以毫秒为单位)
##水平对水印。
##
#memory_monitor_interval = 2500
 
##可用的总内存可以从OS资源中计算出来
##  - 默认选项 - 或作为配置参数提供。
#total_memory_available_override_value = 2GB
 
##设置磁盘空闲限制(以字节为单位)。一旦可用磁盘空间达到此目的
##下限,磁盘报警将被设置 - 请参阅文档
##上面列出了更多的细节。
##
##如果相对定义,绝对水印将被忽略!
#disk_free_limit.absolute = 50000
 
##或者你可以使用内存单元(与vm_memory_high_watermark相同)
##与RabbitMQ 3.6.0+。
#disk_free_limit.absolute = 500KB
#disk_free_limit.absolute = 50mb
#disk_free_limit.absolute = 5GB
 
##或者,我们可以设置一个相对于可用RAM总量的限制。
##
##低于1.0的值可能是危险的,应谨慎使用。
#disk_free_limit.relative = 2.0
 
##
##聚类
## =====================
##
#cluster_partition_handling =忽略
 
## pause_if_all_down策略需要额外的配置
#cluster_partition_handling = pause_if_all_down
 
##恢复策略。可以是“autoheal”或“忽略”
#cluster_partition_handling.pause_if_all_down.recover =忽略
 
##节点名称检查
#cluster_partition_handling.pause_if_all_down.nodes.1 = rabbit @ localhost
#cluster_partition_handling.pause_if_all_down.nodes.2 = hare @ localhost
 
##在消息中镜像同步批量大小。增加这将加快速度
##同步,但批量总大小(以字节为单位)不得超过2 GiB。
##在RabbitMQ 3.6.0或更高版本中可用。
##
#mirroring_sync_batch_size = 4096
 
##在启动时自动进行聚类。仅适用
##到第一次刚复位或启动的节点。
##
##相关文档指南:http://rabbitmq.com//cluster-formation.html
##
 
#autocluster.peer_discovery_backend = rabbit_peer_discovery_classic_config
#
#autocluster.classic_config.nodes.node1 = rabbit1 @ hostname
#autocluster.classic_config.nodes.node2 = rabbit2 @ hostname
#autocluster.classic_config.nodes.node3 = rabbit3 @ hostname
#autocluster.classic_config.nodes.node4 = rabbit4 @ hostname
 
##基于DNS的对等发现。这后端将列出A记录
##配置的主机名##并执行反向查找
##返回的地址。
 
#autocluster.peer_discovery_backend = rabbit_peer_discovery_dns
#autocluster.dns.hostname = rabbitmq.discovery.mycompany.local
 
##此节点的类型可以配置。如果你不确定
##使用什么节点类型,总是使用“光盘”。
#autocluster.node_type =光盘
 
##发送Keepalive消息的间隔(以毫秒为单位)
##给其他集群成员。请注意,这不是一回事
## as net_ticktime; 遗漏的keepalive消息不会导致节点
##被认为是失望的。
##
#cluster_keepalive_interval = 10000
 
##
##统计收集
## =====================
##
 
##设置(内部)统计信息收集粒度。
##
##可以不是,粗或细
#collect_statistics =无
 
#collect_statistics =粗略
 
##统计信息收集间隔(以毫秒为单位)。增加
##这将减少管理数据库的负载。
##
#collect_statistics_interval = 5000
 
##
##其他/高级选项
## =====================
##
##注意:只有在你明白自己在做什么的情况下才能改变这些!
##
 
##显式启用/禁用hipe编译。
##
#hipe_compile = false
 
##在等待群集中的Mnesia表时使用的超时
##变得可用。
##
#mnesia_table_loading_retry_timeout = 30000
 
##在群集启动中等待Mnesia表时重试。注意
##此设置不适用于Mnesia升级或节点删除。
##
#mnesia_table_loading_retry_limit = 10
 
##以字节为单位的大小,低于该大小将消息嵌入到队列索引中。
##相关文档指南:http://rabbitmq.com/persistence-conf.html
##
#queue_index_embed_msgs_below = 4096
 
##你也可以用内存单位来设置这个大小
##
#queue_index_embed_msgs_below = 4kb
 
##是否启用所有的后台定期GC
## Erlang处于“等待”状态。
##
##禁用后台GC可以减少客户端操作的延迟,
##保持启用可能会减少RAM的使用量。
##
#background_gc_enabled = false
 
##运行背景GC的目标(期望)间隔(以毫秒为单位)。
##实际时间间隔取决于执行时间的长短
##操作(可高于此间隔)。值小于
##不建议使用30000毫秒。
##
#background_gc_target_interval = 60000
 
##是否启用代理协议支持。
##一旦启用,客户端不能直接连接到代理
##了。他们必须通过一个负载均衡器连接发送
##代理协议头在连接时间给代理。
##此设置仅适用于AMQP客户端,其他协议
##像MQTT或STOMP这样的##有自己的设置来启用代理协议。
##请参阅插件文档以获取更多信息。
##
#proxy_protocol = false
 
## ------------------------------------------------ ----------------------------
##高级的Erlang网络/集群选项。
##
##相关文档指南:http://rabbitmq.com/clustering.html
## ------------------------------------------------ ----------------------------
 
#======================================
#内核部分
#======================================
 
#kernel.net_ticktime = 60
 
## ------------------------------------------------ ----------------------------
## RabbitMQ管理插件
##
##相关文档指南:http://rabbitmq.com/management.html。
## ------------------------------------------------ ----------------------------
 
#=======================================
#管理部分
#=======================================
 
##从以下JSON文件中预载模式定义。
##相关文档指南:http://rabbitmq.com/management.html#load-definitions。
##
#management.load_definitions = /path/to/exported/definitions.json
 
##将所有对管理HTTP API的请求记录到一个文件中。
##
#management.http_log_dir = /path/to/access.log
 
##更改HTTP侦听器侦听的端口,
##指定Web服务器绑定的接口。
##还要将侦听器设置为使用TLS并提供TLS选项。
##
 
#management.listener.port = 15672
#management.listener.ip = 127.0.0.1
#management.listener.ssl = true
 
#management.listener.ssl_opts.cacertfile = /path/to/cacert.pem
#management.listener.ssl_opts.certfile = /path/to/cert.pem
#management.listener.ssl_opts.keyfile = /path/to/key.pem
 
##“基本”,“详细”或“无”之一。看到
## http://rabbitmq.com/management.html#fine-stats了解更多详情。
#management.rates_mode =基本
 
##配置聚合数据的长度(如消息速率和队列
##长度)被保留。请阅读插件的文档
## http://rabbitmq.com/management.html#configuration更多
## 细节。
##您可以使用“分钟”,“小时”和“日”键或整数键(以秒为单位)
#management.sample_retention_policies.global.minute = 5
#management.sample_retention_policies.global.hour = 60
#management.sample_retention_policies.global.day = 1200
 
#management.sample_retention_policies.basic.minute = 5
#management.sample_retention_policies.basic.hour = 60
 
#management.sample_retention_policies.detailed.10 = 5
 
## ------------------------------------------------ ----------------------------
## RabbitMQ铲子插件
##
##相关文档指南:http://rabbitmq.com/shovel.html
## ------------------------------------------------ ----------------------------
 
## Shovel插件配置示例在additional.config文件中定义
 
 
## ------------------------------------------------ ----------------------------
## RabbitMQ STOMP插件
##
##相关文档指南:http://rabbitmq.com/stomp.html
## ------------------------------------------------ ----------------------------
 
#=======================================
#STOMP部分
#=======================================
 
##网络配置。格式通常与核心代理相同。
##
#stomp.listeners.tcp.default = 61613
 
##与ssl监听器相同
##
#stomp.listeners.ssl.default = 61614
 
##将接受TCP连接的Erlang进程的数量
##和TLS监听器。
##
#stomp.num_acceptors.tcp = 10
#stomp.num_acceptors.ssl = 1
 
##其他TLS选项
 
##使用TLS时,从客户端证书中提取名称。
##
#stomp.ssl_cert_login = true
 
##设置默认的用户名和密码。这被用作默认登录
##每当CONNECT框架省略登录名和密码头。
##
##请注意,设置这将允许客户端连接没有
##验证!
##
#stomp.default_user = guest
#stomp.default_pass = guest
 
##如果配置了默认用户,或者您已配置使用TLS客户端
##证书为基础的身份验证,您可以选择允许客户端
##完全忽略CONNECT帧。如果设置为true,则客户端是
##自动连接为默认用户或用户提供的
##每当在一个会话上发送的第一帧不是一个## TLS证书
##连接框架。
##
#stomp.implicit_connect = true
 
##是否启用代理协议支持。
##一旦启用,客户端不能直接连接到代理
##了。他们必须通过一个负载均衡器连接发送
##代理协议头在连接时间给代理。
##此设置仅适用于STOMP客户端,其他协议
##像MQTT或AMQP这样的##有自己的设置来启用代理协议。
##请参阅插件或代理文档以获取更多信息。
##
#stomp.proxy_protocol = false
 
## ------------------------------------------------ ----------------------------
## RabbitMQ MQTT适配器
##
##见https://github.com/rabbitmq/rabbitmq-mqtt/blob/stable/README.md
##的细节
## ------------------------------------------------ ----------------------------
 
#=======================================
#MQTT部分
#=======================================
 
##设置默认的用户名和密码。将被用作默认登录
##如果连接客户端没有提供其他登录信息。
##
##请注意,设置这将允许客户端连接没有
##验证!
##
#mqtt.default_user = guest
#mqtt.default_pass = guest
 
##启用匿名访问。如果这被设置为false,客户端必须提供
##登录信息才能连接。请参阅default_user / default_pass
##配置元素管理登录没有身份验证。
##
#mqtt.allow_anonymous = true
 
##如果你有多个chosts,指定哪个
##适配器连接。
##
#mqtt.vhost = /
 
##指定发布来自MQTT客户端的消息的交换。
##
#mqtt.exchange = amq.topic
 
##指定TTL(生存时间)来控制非干净会话的生命周期。
##
#mqtt.subscription_ttl = 1800000
 
##设置预取计数(控制未确认的最大数量
##消息将被交付)。
##
#mqtt.prefetch = 10
 
## TCP / SSL配置(按照代理配置)。
##
#mqtt.listeners.tcp.default = 1883
 
##与ssl监听器相同
##
#mqtt.listeners.ssl.default = 1884
 
##将接受TCP连接的Erlang进程的数量
##和TLS监听器。
##
#mqtt.num_acceptors.tcp = 10
#mqtt.num_acceptors.ssl = 1
 
## TCP侦听器选项(按照代理配置)。
##
#mqtt.tcp_listen_options.backlog = 128
#mqtt.tcp_listen_options.nodelay = true
 
##是否启用代理协议支持。
##一旦启用,客户端不能直接连接到代理
##了。他们必须通过一个负载均衡器连接发送
##代理协议头在连接时间给代理。
##此设置仅适用于STOMP客户端,其他协议
##像STOMP或AMQP有自己的设置来启用代理协议。
##请参阅插件或代理文档以获取更多信息。
##
#mqtt.proxy_protocol = false
 
## ------------------------------------------------ ----------------------------
## RabbitMQ AMQP 1.0支持
##
##见https://github.com/rabbitmq/rabbitmq-amqp1.0/blob/stable/README.md。
## ------------------------------------------------ ----------------------------
 
#=======================================
#AMQP 1.0部分
#=======================================
 
 
##未通过SASL认证的连接将以此连接
##帐户。请参阅自述文件以获取更多信息。
##
##请注意,设置这将允许客户端连接没有
##验证!
##
#amqp1_0.default_user = guest
 
##启用协议严格模式。请参阅自述文件以获取更多信息。
##
#amqp1_0.protocol_strict_mode = false
 
## Lager控制记录。
##请参阅https://github.com/basho/lager获取更多文档
##
## Log direcrory,默认情况下取自RABBITMQ_LOG_BASE env变量。
##
#log.dir = / var / log / rabbitmq
 
##记录到控制台(可以为true或false)
##
#log.console = false
 
## Loglevel登录到控制台
##
#log.console.level = info
 
##记录到文件。可以是假的或文件名。
##默认:
#log.file = rabbit.log
 
## 把关掉:
#log.file = false
 
## Loglevel记录到文件
##
#log.file.level = info
 
##文件旋转配置。没有旋转的defualt。
##不要将旋转日期设置为“”。如果需要“”值,请保持不变
#log.file.rotation.date = $ D0
#log.file.rotation.size = 0
 
 
## QA:配置系统日志记录
#log.syslog = false
#log.syslog.identity = rabbitmq
#log.syslog.level = info
#log.syslog.facility =守护进程
 
 
## ------------------------------------------------ ----------------------------
## RabbitMQ LDAP插件
##
##相关文档指南:http://rabbitmq.com/ldap.html。
##
## ------------------------------------------------ ----------------------------
 
#=======================================
#LDAP部分
#=======================================
 
##
##连接到LDAP服务器
## ================================
##
 
##指定要绑定的服务器。你*必须*设置为了插件
##正常工作。
##
#auth_ldap.servers.1 =你的服务器名称在这里
 
##您可以定义多个服务器
#auth_ldap.servers.2 =你的其他服务器
 
##使用TLS连接到LDAP服务器
##
#auth_ldap.use_ssl = false
 
##指定要连接的LDAP端口
##
#auth_ldap.port = 389
 
## LDAP连接超时,以毫秒或“无限”
##
#auth_ldap.timeout =无限
 
##或号码
#auth_ldap.timeout = 500
 
##启用LDAP查询的记录。
##其中之一
##  -  false(不记录)
##  -  true(详细记录插件使用的逻辑)
##  - 网络(如同,但另外记录LDAP网络流量)
##
##默认为false。
##
#auth_ldap.log = false
 
##也可以是真实的或网络
#auth_ldap.log = true
#auth_ldap.log =网络
 
##
##认证
## ==============
##
 
##模式将通过AMQP给出的用户名转换为DN
## 捆绑
##
#auth_ldap.user_dn_pattern = cn = $ {username},ou = People,dc = example,dc = com
 
##或者,您可以将用户名转换为Distinguished
##绑定后通过LDAP查找命名。请参阅文档
##全部细节。
 
##通过查找将用户名转换为dn时,将其设置为
##表示用户名的属性的名称,而查找查询的
##base DN。
##
#auth_ldap.dn_lookup_attribute = userPrincipalName
#auth_ldap.dn_lookup_base = DC = gopivotal,DC = com
 
##控制如何绑定授权查询,也可以
##检索登录用户的详细信息,而不显示一个
##密码(例如,SASL EXTERNAL)。
##其中之一
##  -  as_user(作为认证用户进行绑定 - 需要密码)
##  - 匿名(匿名绑定)
##  -  {UserDN,Password}(用指定的用户名和密码绑定)
##
##默认为'as_user'。
##
#auth_ldap.other_bind = as_user
 
##或者可以更复杂:
#auth_ldap.other_bind.user_dn =用户
#auth_ldap.other_bind.password =密码
 
##如果user_dn和密码定义 - 其他选项被忽略。
 
#-----------------------------
#太复杂的LDAP部分
#-----------------------------
 
##
##授权
## =============
##
 
## LDAP插件可以针对您的应用程序执行各种查询
## LDAP服务器来确定授权的问题。
##
##相关文档指南:http://rabbitmq.com/ldap.html#authorisation。
 
##以下配置应该在additional.config文件中定义
##不要处理这条线!
 
##将查询设置为在确定访问虚拟主机时使用
##
## {vhost_access_query,{in_group,
##“ou = $ {vhost} -users,ou = vhosts,dc = example,dc = com”}}
 
##设置查询以在确定资源(例如,队列)访问时使用
##
## {resource_access_query,{constant,true}},
 
##设置查询来确定用户拥有哪些标签
##
## {tag_queries,[]}
#]},
#-----------------------------

参考文档:

RabbitMQ安装

http://www.cnblogs.com/sellsa/p/8036909.html

RabbitMQ生产部署指南

http://www.cnblogs.com/sellsa/p/8046156.html

rabbitMQ集群

https://www.cnblogs.com/sellsa/p/8056173.html

未经允许不得转载:江哥架构师笔记 » rabbitmq学习:基础

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址