rabbitmq消息队列

一、消息队列简介

1.消息队列角色

(1)Broker:

消息服务器,作为server提供消息核心服务

(2)Producer:

消息生产者,业务的发起方,负责生产消息传输给broker

(3)Consumer:

消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理

(4)Topic:

主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播

(5)Queue:

队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收

(6)Message:

消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输

2.消息队列工作模式 

(1)Point-to-Point

        点对点,其过程理解起来比较简单。它好比是两个人打电话,这两个人是独享这一条通信链路的。一方发送消息,另外一方接收,就这么简单。在点对点模式下,消息被保留在队列中。 一个或多个消费者可以消耗队列中的消息,但是特定消息只能由最多一个消费者消费。 一旦消费者读取队列中的消息,它就从该队列中消失。 该模式的典型示例,如订单处理系统,其中每个订单将由一个订单处理器处理,但多个订单处理器也可以同时工作。

(2)Pub/Sub

       即发布/订阅模式,该模式有点类似于我们日常生活中订阅报纸。对于每一个订阅者来说,可以选择一份或者多份报纸。那么这些我们订阅的报纸,就相当于发布订阅模式里的topic。有很多个人订阅报纸,也有人可能和我订阅了相同的报纸。多人订阅了相同的报纸相当于多人在同一个topic里注册了。对于一份报纸发行方来说,它和所有的订阅者就构成了一个1对多的关系。在这种模式下,消息被保留在主题中。 与点对点模式不同,消费者可以订阅一个或多个主题并使用该主题中的所有消息。 该模式下消息生产者称为发布者,消息使用者称为订阅者。

3.消息队列缺点

系统可用性降低

系统复杂性提高

数据一致性无法保证

二、RabbitMQ 

       RabbitMQ是一款在全球范围内使用非常广泛的开源消息队列中间件。它轻量级、易部署、并支持多种协议。它基于Erlang开发,天生拥有高并发的能力。

1.Rabbit MQ

(1)生产者

产生消息的进程或服务

(2)消费者

接收消息的进程或服务

(3)队列

RabbitMQ是消息队列中间件,而真正储存消息数据的就是队列,队列可以有很多。

(4)交换器

类似于网络设备交换机,它可以根据不同的关键字,将消息发送到不同的队列。

 (5)虚拟主机

       虚拟主机类似于Apache的虚拟主机,如果没有虚拟主机,当RabbitMQ中的数据越来越庞大,队列越来越多,随之而来的是令人头痛的管理问题,比如队列、交换器命名冲突,它们相互影响等等。虚拟主机能够解决这些问题,而不需要我们部署多个RabbitMQ来负责不同的业务。

       虚拟主机提供了资源的逻辑分组和分隔,每一个虚拟主机本质上是mini版的RabbitMQ服务器,他们有用自己的连接、队列、绑定、交换器,更重要的是有用自己的权限机制,这有点类似服务器和运行在服务器上的虚拟机一样。

三、安装Rabbit MQ  (单机)

1.安装erlang

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# setenforce 0

利用阿里云仓库部署

[root@localhost ~]# yum install -y erlang   rabbitmq-server          ##安装erlang  ## 安装rabbitmq服务

2. 启动RabbitMQ

[root@localhost ~]# systemctl start rabbitmq-server             

## 监听端口为4369,25672

[root@localhost ~]# ps aux |grep rabbit                  ## 查看rabbit进程

[root@localhost ~]# netstat -lntp                     ## 查看监听端口

3.开启web管理控制台

[root@localhost ~]# rabbitmq-plugins enable rabbitmq_management                      ##激活插件

[root@localhost ~]# rabbitmq-plugins list                      ## 查看所有插件

4.Nginx代理

[root@localhost ~]# yum install -y nginx        ##安装nginx

vim /etc/nginx/conf.d/rabbitmq.conf

server {

listen 80;

server_name www.fllrabbit.com;

        location /

        {

            proxy_pass http://127.0.0.1:15672;

            proxy_set_header Host $host;

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;     }

}

[root@localhost ~]# systemctl start nginx  

[root@localhost ~]# systemctl start rabbitmq-server 

现在可以通过浏览器访问rabbit,账号密码都是:guest

5.发送消息到rabbitmq

(1)打开另一台主机安装python3

[root@localhost ~]# yum -y install python3

[root@localhost ~]# pip3 install pika

(2)编辑测试程序

[root@localhost ~]# vim send_message.sh        

(3)测试发送消息

[root@localhost ~]# python3 send_message.sh

(4)查看RabbitMQ

 6.RabbitMQ接收消息

(1)安装python3

打开第三台主机

[root@localhost ~]# yum -y install python3

[root@localhost ~]# pip3 install pika

2编写测试程序

[root@localhost ~]# vim receice_message.sh

(3)执行程序接收消息

[root@localhost ~]# python3 receice_message.sh

Waiting for messages. To exit press CTRL+C

Received Hello, RabbitMQ!

Received Hello, RabbitMQ!

Received Hello, RabbitMQ!

注意:

可以一边发送消息,一边观察接收到的消息。

四、rabbitmq 常用命令

(3)执行程序接收消息

[root@localhost ~]# python3 receice_message.sh

Waiting for messages. To exit press CTRL+C

Received Hello, RabbitMQ!

Received Hello, RabbitMQ!

Received Hello, RabbitMQ!

注意:

可以一边发送消息,一边观察接收到的消息。

2.用户管理

[root@localhost ~]# rabbitmqctl add_user user1 user1_passwd

##创建user1用户,密码为user1_passwd

[root@localhost ~]# rabbitmqctl list_users

##列出所有用户

[root@localhost ~]# rabbitmqctl change_password user1 new_passwd

##更改user1的密码为new_passwd

[root@localhost ~]# rabbitmqctl delete_user user1

#删除user1用户

备注:

语法汇总

rabbitmqctl list_users              #列出用户

rabbitmqctl add_user <username> <password>                         #创建用户

rabbitmqctl change_password <username> <password>               ##更改用户密码

rabbitmqctl delete_user <username>                   #删除用户

rabbitmqctl clear_password <username>                   #清除用户密码

3.tags角色介绍

(1) 超级管理员(administrator):guest

可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。

(2) 监控者(monitoring)

可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

(3) 策略制定者(policymaker)

可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息。

(4) 普通管理者(management)

仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。

(5) 其他

无法登陆管理控制台,通常就是普通的生产者和消费者。

[root@localhost ~]# rabbitmqctl add_user user1 user1_passwd

[root@localhost ~]# rabbitmqctl set_user_tags user1 managemnet  

##赋予user1用户management角色

[root@localhost ~]# rabbitmqctl add_vhost fll

[root@localhost ~]# rabbitmqctl set_permissions -p fll user1 '.*' '.*' '.*'

-p 指定虚拟主机

##针对fll虚拟主机给user1用户设置所有的配置、读写queue和exchange的权限。默认是没有任何权限的

[root@localhost ~]# rabbitmqctl list_user_permissions user1

##列出user1的权限

[root@localhost ~]# rabbitmqctl list_permissions -p fll

##列出fll下的所有用户权限

如果需要清除user2在fll上的权限

[root@localhost ~]# rabbitmqctl clear_permissions -p fll user2

备注:

其他操作语法

rabbitmqctl list_user_permissions <username>

#列出某用户的权限,即该用户对哪个虚拟主机有权限

rabbitmqctl list_permissions -p <vhostname>

#列出指定虚拟主机下所有用户的权限,即哪些用户对该虚拟主机有权限

rabbitmqctl clear_permissions -p <vhostname> <user>

#清除某用户在指定虚拟机上的授权

4.插件管理

rabbitmq-plugins list                          ##获取RabbitMQ插件列表

rabbitmq-plugins enable              <插件名字> ##安装RabbitMQ插件

rabbitmq-plugins disable               <插件名字> ##卸载某个插件

五、Rabbitmq 集群

     RabbitMQ本身是基于Erlang编写的,Erlang天生支持分布式(通过同步Erlang集群各节点的cookie来实现),因此不需要像Kafka那样通过ZooKeeper来实现分布式集群。

1.元数据

       RabbitMQ内部有各种基础构件,包括队列、交换器、绑定、虚拟主机等,他们组成了AMQP协议消息通信的基础,而这些构件以元数据的形式存在。

2.内存节点与磁盘节点

       在集群中的每个节点,要么是内存节点,要么是磁盘节点,如果是内存节点,会将所有的元数据信息仅存储到内存中,而磁盘节点则不仅会将所有元数据存储到内存上, 还会将其持久化到磁盘。所以在搭建集群的时候,为了保证数据的安全性和性能,最好是两种节点都要有。

3.集群实验

主机名

Ip

节点类型

centos01

192.168.10.101

磁盘节点

Centos02

192.168.10.102

内存节点

Centos03

192.168.10.103

内存节点

(1)配置hosts以及hostname

三台机器设置hostname

hostnamectl set-hostname mq01

hostnamectl set-hostname mq02

hostnamectl set-hostname mq03

三台机器上都需要编辑如下hosts

192.168.10.101 mq01

192.168.10.102 mq02

192.168.10.103 mq03

(2)关闭selinux以及firewalld

三台机器都要执行

setenforce 0

vim  /etc/selinux/conf

systemctl stop firewalld

systemctl disable firewalld

(3)安装rabbitmq

RabbitMQ服务器是用Erlang语言编写的

利用阿里云仓库部署

[root@localhost ~]# yum install -y rabbitmq-server   erlang

(4)启动服务

三台机器都启动起来

[root@localhost ~]# systemctl start rabbitmq-server 

[root@localhost ~]# systemctl enable rabbitmq-server 

[root@localhost ~]# ps aux |grep rabbit                ## 查看rabbit进程

[root@localhost ~]# netstat -lntp                   ## 查看监听端口

(5)安装management插件

三台机器都要开启

rabbitmq-plugins enable rabbitmq_management

(6)同步cookie

在mq01上将mq01的cookie文件同步到mq02和mq03

scp /var/lib/rabbitmq/.erlang.cookie root@mq02:/var/lib/rabbitmq/

scp /var/lib/rabbitmq/.erlang.cookie root@mq03:/var/lib/rabbitmq/

(7)重启三台主机并检查三台主机的rabbitmq服务

[root@localhost ~]# ps aux |grep rabbit             ## 查看rabbit进程

[root@localhost ~]# netstat -lntp                     ## 查看监听端口

重启  服务 reboot

(8)分配节点

centos01为(disc)磁盘节点,centos02和centos03为内存节点。centos02和centos03上都执行:

[root@localhost ~]# rabbitmqctl stop_app    停止rabbitmq

备注:

表示终止RabbitMQ的应用,但是Erlang节点还在运行。在管理RabbitMQ应用时需要停止rabbitmq,但是又要使用erlang对rabbitmq进行管理。

[root@localhost ~]# rabbitmqctl join_cluster --ram rabbit@mq01            将centos02作为内存节点连接到centos01

[root@localhost ~]# rabbitmqctl start_app             开启rabbitmq

[root@localhost ~]# rabbitmqctl cluster_status                   查看集群状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值