搭建RabbitMQ解决电商促销活动高并发的问题
本文转载自: https://www.93bok.com
RabbitMQ概述:
RabbitMQ是使用最广泛的开源消息代理。RabbitMQ轻量级,易于在集群内部和云平台中部署。它支持多种消息传递协议。 它可以满足企业高规模,高可用性的要求。RabbitMQ使用Erlang语言开发的。
MQ概述:
全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。
MQ运行机制:
P表示生产者,C表示消费者,红色部分为消息队列
MQ实战场景:
场景一:
我们在双11的时候,当我们凌晨大量的秒杀和抢购商品,然后去结算的时候,就会发现,界面会提醒我们,让我们稍等,以及一些友好的图片文字提醒。而不是像前几年的时代,动不动就页面卡死,报错等来呈现给用户。在这个业务场景中,我们就可以采用队列的机制来处理,因为同时结算就只能达到这么多。
场景二:
在我们平时的超市中购物也是一样,当我们在结算的时候,并不会一窝蜂一样涌入收银台,而是排队结算。这也是队列机制。一个接着一个的处理,不能插队。
AMQP
RabbitMQ是AMQP服务器的一种
AMQP简介:
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征:
是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
AMQP 里主要两个组件:
Exchange和 Queue (在 AMQP 1.0 里还会有变动),如下图所示,绿色的 X 就是 Exchange ,红色的是 Queue ,这两者都在 Server 端,又称作 Broker ,这部分是 RabbitMQ 实现的,而蓝色的则是客户端,通常有 Producer(生产者) 和 Consumer(消费者) 两种类型:
官方网站:http://www.rabbitmq.com/
下载地址:http://www.rabbitmq.com/download.html
运行RabbitMQ监听端口号:
4369 #erlang发现口
5672 #client端通信口
15672 #管理界面ui端口
25672 #server间内部通信口
RabbitMQ搭建
https://www.93bok.com/RabbitMQ消息中间件搭建for Centos7/
RabbitMQ使用方法
RabbitMQ相关查看命令
rabbitmqctl list_connections ##查看当前连接
rabbitmqctl list_queues ##列出所有队列
rabbitmqctl status ##查看当前队列信息
RabbitMQ的vhost管理
实战场景: 当我们在创建用户时,会指定用户能访问一个虚拟机,并且该用户只能访问该虚拟机下的队列和交换机,如果没有指定,默认的是”/”;一个rabbitmq服务器上可以运行多个vhost,以便于适用不同的业务需要,这样做既可以满足权限配置的要求,也可以避免不同业务之间队列、交换机的命名冲突问题,因为不同vhost之间是隔离的。
1、添加93bok-web和93bok-bbs两个虚拟机来管理网站和论坛的队列
rabbitmqctl add_vhost 93bok-web
rabbitmqctl add_vhost 93bok-bbs
2、查看虚拟机列表
rabbitmqctl list_vhost
3、删除93bok-bbs虚拟机
rabbitmqctl delete_vhost 93bok-bbs
实战演示使用python调用RabbitmMQ服务
1、安装python环境
yum -y install python
2、安装pip命令
yum -y install epel-release
yum -y install python-pip
3、更新pip
pip install --upgrade pip
4、安装pika模块
Python使用pika模块调用rabbitmq
注意:rabbitmq本质是一个生产者和消费者的模型结构。生产者->rabbitmq->消费者,即生产者产生消息,给到rabbitmq存储,消费者从rabbitmq中读取数据。
5、创建生产者代码send.py
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()
6、创建消费者代码receive.py
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()
7、开始测试队列
python send.py ##执行两次命令,产生两个名字叫hello的消息
rabbitmqctl list_queues ##查看消息队列喂为2
在web界面查看消息队列,可以发现2个消息队列等待处理:
python receive.py ##消费这两个消息
rabbitmqctl list_queues ##查看队列已经为0
在web界面查看队列,也为0了