搭建RabbitMQ解决电商促销活动高并发的问题

RabbitMQ概述和运行机制
Rabbitmq使用方法
使用python调用rabbitmq服务器

RabbitMQ概述和运行机制

RabbitMQ概述

RabbitMQ是使用最广泛的开源消息代理。
RabbitMQ轻量级,易于在集群内部和云平台中部署。它支持多种消息传递协议。 它可以满足企业高规模,高可用性的要求。
RabbitMQ使用Erlang语言开发的。

MQ概述:全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。
应用程序通过读写队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。

MQ运行机制: P表示生产者,C表示消费者,红色部分为消息队列

在这里插入图片描述

MQ实战场景:

场景1:
我们在双11的时候,当我们凌晨大量的秒杀和抢购商品,然后去结算的时候,就会发现,界面会提醒我们,让我们稍等,以及一些友好的图片文字提醒。而不是像前几年的时代,动不动就页面卡死,报错等来呈现给用户。在这个业务场景中,我们就可以采用队列的机制来处理,因为同时结算就只能达到这么多。
在这里插入图片描述

场景2:
在我们平时的超市中购物也是一样,当我们在结算的时候,并不会一窝蜂一样涌入收银台,而是排队结算。这也是队列机制。一个接着一个的处理,不能插队。
在这里插入图片描述

官方网站:http://www.rabbitmq.com/
在这里插入图片描述

下载地址:http://www.rabbitmq.com/download.html

运行RabbitMQ监听端口号:

4369erlang发现口
5672client端通信口
15672管理界面ui端口
25672server间内部通信口

实战 - 搭建RabbitMQ服务器

RabbitMQ是用erlang语言编写的,所以我们先安装erlang语言环境
配置erlang语言环境

[root@xuegod63 ~]# vim /etc/yum.repos.d/rabbitmq-erlang.repo
[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/7
gpgcheck=1
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
enabled=1

[root@xuegod63 ~]# rpm --import  https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
[root@xuegod63 ~]# yum install erlang -y      #安装erlang

安装Rabbitmq服务

下载rabbitmq地址:http://www.rabbitmq.com/download.html
在这里插入图片描述
上传本地的rabbitmq-server-3.7.7-1.el7.noarch.rpm到 linux 系统中

[root@ ~]# yum install rabbitmq-server-3.7.7-1.el7.noarch.rpm

yum也可以安装本地的rpm包,而且可以自动解决依赖,
这一招学到手:

启用RabbitMQ的web插件 ,方便后期在web图形进行管理:

[root@ ~]#  rabbitmq-plugins enable rabbitmq_management 
...
Offline change; changes will take effect at broker restart. 
#离线变更; 更改将在代理重启时生效。

[root@ ~]# systemctl start rabbitmq-server  #启动服务  

报错:
Job for rabbitmq-server.service failed because the control process exited with error code. See “systemctl status rabbitmq-server.service” and “journalctl -xe” for details.

解决:

[root@ ~]# ll /var/lib/rabbitmq/ -a总用量 8
drwxr-xr-x   3 rabbitmq rabbitmq   42 9月  10 15:02 .
drwxr-xr-x. 56 root     root     4096 9月  10 14:53 ..
-r--------   1 root     root       20 9月  10 00:00 .erlang.cookie

注:发现.erlang.cookie的文件拥有者是root,而rabbitmq服务是以rabbitqm普通用户运行的, 这就无法往.erlang.cookie里写入数据,所以报错了。

[root@ ~]#  chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie  #修改文件拥有者

[root@ ~]# netstat  -antup | grep 5672  #查看端口号
tcp        0      0 0.0.0.0:15672     0.0.0.0:*               LISTEN      57692/beam.smp      
tcp        0      0 0.0.0.0:25672     0.0.0.0:*               LISTEN      57692/beam.smp      
tcp6       0      0 :::5672           :::*                    LISTEN      57692/beam.smp      

为RabbitMQ创建用户并赋权。

[root@ ~]# rabbitmqctl add_user root 123456  #添加用户

[root@ ~]# rabbitmqctl set_user_tags root administrator #设置用户权限为administrator

[root@ ~]# iptables -F  #清空防火规则

测试登录,发现可以登录成功:
在这里插入图片描述
到此,已经搭建rabbitmq成功。

Rabbitmq使用方法

Rabbitmq的vhost管理

实战场景:
当我们在创建用户时,会指定用户能访问一个虚拟机,并且该用户只能访问该虚拟机下的队列和交换机,如果没有指定,默认的是”/”;

一个rabbitmq服务器上可以运行多个vhost,以便于适用不同的业务需要,这样做既可以满足权限配置的要求,也可以避免不同业务之间队列、交换机的命名冲突问题,因为不同vhost之间是隔离的。

添加xuegod-web和xuegod-bbs两个虚拟机来管理网站和论坛的队列

[root@ ~]# rabbitmqctl add_vhost xuegod-web

[root@ ~]# rabbitmqctl add_vhost xuegod-bbs

查看创建的虚拟主机
在这里插入图片描述

Rabbitmq用户、角色和权限管理

1.权限设置

权限设置语法:

rabbitmqctl set_permissions [-p vhostpath] {user} {conf} {write} {read} 

conf: 一个正则表达式match哪些配置资源能够被该用户访问。 

write: 一个正则表达式match哪些配置资源能够被该用户写。 

read: 一个正则表达式match哪些配置资源能够被该用户读。

例1:创建用户root对默认虚拟主机 / 拥有所有权限

[root@xuegod63 ~]# rabbitmqctl set_permissions -p / root '.*' '.*' '.*'   

#该命令使用户root 对默认虚拟主机/中所有资源的拥有:配置、写、读权限

2.查看权限
在这里插入图片描述

使用python调用rabbitmq服务器

安装python实验环境

[root@ ~]# yum install python  #安装python

[root@ ~]# yum install epel-release -y   #安装扩展yum源

[root@ ~]# yum install python-pip -y    #安装pip命令

[root@ ~]# pip install --upgrade pip    #更新pip

[root@ ~]# pip install pika    #安装pika模块。python用pika模块调用rabbitmq。

注:rabbitmq本质是一个生产者和消费者的模型结构。生产者–>rabbitmq–>消费者,即生产者产生消息,给到rabbitmq存储,消费者从rabbitmq中读取数据。

创建生产者代码 send.py

[root@ ~]# vim  send.py 


#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
    host='localhost'))
channel = connection.channel()


channel.queue_declare(queue='hello')

channel.basic_publish(exchange='',
                  routing_key='hello',
                  body='Hello World!')

print(" [x] Sent 'Hello World!'")
connection.close()

注:declare [dɪˈkleə®] 声明
consuming [kənˈsju:mɪŋ] 消费
publish [ˈpʌblɪʃ] 颁布

创建消费者代码 receive.py

[root@ ~]# vim receive.py 


#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
    host='localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

def callback(ch, method, properties, body):
print(" [x] Received %r" % body)


channel.basic_consume(callback,
                  queue='hello',
                  no_ack=True)


print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

开始测试队列

[root@ ~]# python send.py   #此命令执行两次,产生两个名字叫hello的消息
[x] Sent 'Hello World!'

[root@ ~]# python send.py
[x] Sent 'Hello World!'

在这里插入图片描述
在这里插入图片描述

[root@ ~]# rabbitmqctl list_queues     #查看消息队列为2
Timeout: 60.0   seconds ...
Listing queues for vhost / ...
hello	2 

在web界面查看消息队列,发现在2个消息队列等待处理:
在这里插入图片描述
在这里插入图片描述

[root@ ~]# python receive.py   #消费或处理这2个消息
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Hello World!'   #可以看输出了消息队列中的消息内容
[x] Received 'Hello World!'


[root@ ~]# rabbitmqctl list_queues   #查看队列,已经为0
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
hello	0

在web界面,查看队列,也为 0 了

在这里插入图片描述

总结:

  • RabbitMQ概述和运行机制
  • Rabbitmq使用方法
  • 使用python调用rabbitmq服务器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值