rabbitMQ

RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing
Protocol高级消息队列协议)的标准实现,用erlang语言开发。RabbitMQ据说具有良好的性能和时效性,同时还能够非常好的支持集群和负载部署,非常适合在较大规模的分布式系统中使用

单一模式

最简单的情况,非集群模式,即单实例服务

普通模式

默认的集群模式,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节点恢复,然后才可被消费;如果没有持久化的话,队列数据就丢失了。

镜像模式

把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案。该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉

 

安装

第一种方式安装,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    # 停止服务

记得要开放5672和15672端口

 

用户配置

# 查看当前所有用户
$ 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

web管理

 

开启用户远程访问

默认情况下,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 22, 2020
如果你想请我喝奶茶的话