Loading... # rabbitMQ > RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing > Protocol高级消息队列协议)的标准实现,用erlang语言开发。RabbitMQ据说具有良好的性能和时效性,同时还能够非常好的支持集群和负载部署,非常适合在较大规模的分布式系统中使用 <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-fab9b975148c343e7b593482ab12edd911" aria-expanded="true"><div class="accordion-toggle"><span>单一模式</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div id="collapse-fab9b975148c343e7b593482ab12edd911" class="panel-body collapse"> 最简单的情况,非集群模式,即单实例服务 </div></div> <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-973c667c823b67641a562f9960528f7e39" aria-expanded="true"><div class="accordion-toggle"><span>普通模式</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div id="collapse-973c667c823b67641a562f9960528f7e39" class="panel-body collapse"> 默认的集群模式,queue创建之后,如果没有其它policy,则queue就会按照普通模式集群。对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构,但队列的元数据仅保存有一份,即创建该队列的rabbitmq节点(A节点),当A节点宕机,你可以去其B节点查看,./rabbitmqctl list_queues 发现该队列已经丢失,但声明的exchange还存在。 当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。 所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连A或B,出口总在A,会产生瓶颈。该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,队列数据就丢失了。 </div></div> <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-bb8cb9af0e73b350046fcecd942675b263" aria-expanded="true"><div class="accordion-toggle"><span>镜像模式</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div id="collapse-bb8cb9af0e73b350046fcecd942675b263" class="panel-body collapse"> 把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案。该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉 </div></div> ## 安装 ### 第一种方式安装,3.6.6版本 **1**.由于`RabbitMQ`依赖`Erlang`, 所以需要先安装`Erlang` $ wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm $ sudo rpm -ivh erlang-solutions-1.0-1.noarch.rpm $ sudo yum install erlang **2**.完成后安装`RabbitMQ`先下载`rpm`包,然后`yum`安装 $ wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el7.noarch.rpm $ sudo yum install rabbitmq-server-3.6.6-1.el7.noarch.rpm **3**.安装时如果遇到下面的依赖错误 Error: Package: socat-1.7.2.3-1.el6.x86_64 (epel) Requires: libreadline.so.5()(64bit) 可以尝试先执行 $ sudo yum install socat ### 第二种方式安装,3.78版本 **1**.下载rlang和rabbitmq ``` $ wget https://zysd-shanghai.oss-cn-shanghai.aliyuncs.com/software/linux/erlang/erlang-21.1-1.el7.centos.x86_64.rpm $ wget https://zysd-shanghai.oss-cn-shanghai.aliyuncs.com/software/linux/rabbitmq/rabbitmq-server-3.7.8-1.el7.noarch.rpm ``` **2**.安装Erlang ``` $ rpm -ivh erlang-21.1-1.el7.centos.x86_64.rpm ``` **3**.安装RabbitMQ ``` $ rpm -ivh rabbitmq-server-3.7.8-1.el7.noarch.rpm ``` 安装RabbitMQ时如果遇到下面的依赖错误,先执行 ``` $ sudo yum install socat ``` ### 基本命令 $ sudo chkconfig rabbitmq-server on # 添加开机启动RabbitMQ服务 $ sudo /sbin/service rabbitmq-server start # 启动服务 $ sudo /sbin/service rabbitmq-server status # 查看服务状态 $ sudo /sbin/service rabbitmq-server stop # 停止服务 <div class="tip inlineBlock warning"> 记得要开放5672和15672端口 </div> ### 用户配置 # 查看当前所有用户 $ sudo rabbitmqctl list_users # 查看默认guest用户的权限 $ sudo rabbitmqctl list_user_permissions guest # 由于RabbitMQ默认的账号用户名和密码都是guest。为了安全起见, 先删掉默认用户 $ sudo rabbitmqctl delete_user guest # 添加新用户 $ sudo rabbitmqctl add_user username password # 设置用户tag $ sudo rabbitmqctl set_user_tags username administrator # 赋予用户默认vhost的全部操作权限 $ sudo rabbitmqctl set_permissions -p / username ".*" ".*" ".*" # 查看用户的权限 $ sudo rabbitmqctl list_user_permissions username ### web管理接口 如果只从命令行操作`RabbitMQ`,多少有点不方便。`RabbitMQ`自带了`web`管理界面,只需要启动插件便可以使用。然后通过浏览器访问` [http://localhost:15672] `输入用户名和密码访问`web`管理界面 $ sudo rabbitmq-plugins enable rabbitmq_management  ### 开启用户远程访问 默认情况下,`RabbitMQ`的默认的`guest`用户只允许本机访问, 如果想让`guest`用户能够远程访问的话,只需要将配置文件中的`loopback_users`列表置为空即可,如下: {loopback_users, []} 另外关于新添加的用户,直接就可以从远程访问的,如果想让新添加的用户只能本地访问,可以将用户名添加到上面的列表, 如只允许`admin`用户本机访问。 {loopback_users, ["admin"]} ## 用户角色分类 > none、management、policymaker、monitoring、administrator **1.none** 不能访问 management plugin **2.management** 用户可以通过AMQP做的任何事外加: 列出自己可以通过AMQP登入的virtual hosts 查看自己的virtual hosts中的queues, exchanges 和 bindings 查看和关闭自己的channels 和 connections 查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动。 **3.policymaker** management可以做的任何事外加: 查看、创建和删除自己的virtual hosts所属的policies和parameters **4.monitoring** management可以做的任何事外加: 列出所有virtual hosts,包括他们不能登录的virtual hosts 查看其他用户的connections和channels 查看节点级别的数据如clustering和memory使用情况 查看真正的关于所有virtual hosts的全局的统计信息 **5.administrator** policymaker和monitoring可以做的任何事 ## **dockr部署** **1**.拉取RabbitMQ镜像文件,这里加上了`management`,表明是带`web`管理界面的,便于管理 docker pull rabbitmq:management **2**.创建并启动容器,并将本地`15672`映射到`8080`端口 docker run -d --hostname my-rabbit --name rabbit -p 8080:15672 rabbitmq:management **参数说明** - --hostname:指定容器主机名称 - --name: 指定容器名称 - -p: 将mq端口号映射到本地 **3**.查看`rabbitmq`运行状况 docker logs rabbit  Last modification:December 22nd, 2020 at 08:35 pm © 禁止转载 Support 如果你想请我喝奶茶的话 ×Close Appreciate the author Sweeping payments Pay by AliPay Pay by WeChat