搭建RabbitMQ解決電商促銷活動高並發的問題


本文轉載自: https://www.93bok.com

RabbitMQ概述:

RabbitMQ是使用最廣泛的開源消息代理。RabbitMQ輕量級,易於在集群內部和雲平台中部署。它支持多種消息傳遞協議。 它可以滿足企業高規模,高可用性的要求。RabbitMQ使用Erlang語言開發的。

MQ概述:

全稱為Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法。應用程序通過讀寫隊列的消息(針對應用程序的數據)來通信,而無需專用連接來鏈接它們。

MQ運行機制:

P表示生產者,C表示消費者,紅色部分為消息隊列

iJHb0P.png

MQ實戰場景:

場景一:

我們在雙11的時候,當我們凌晨大量的秒殺和搶購商品,然后去結算的時候,就會發現,界面會提醒我們,讓我們稍等,以及一些友好的圖片文字提醒。而不是像前幾年的時代,動不動就頁面卡死,報錯等來呈現給用戶。在這個業務場景中,我們就可以采用隊列的機制來處理,因為同時結算就只能達到這么多。

iJHOk8.png

iJHjfg.png

場景二:

在我們平時的超市中購物也是一樣,當我們在結算的時候,並不會一窩蜂一樣涌入收銀台,而是排隊結算。這也是隊列機制。一個接着一個的處理,不能插隊。

iJHxpQ.png

AMQP

RabbitMQ是AMQP服務器的一種

AMQP簡介:

AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標准,為面向消息的中間件設計。

消息中間件主要用於組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。

AMQP的主要特征:

是面向消息、隊列、路由(包括點對點和發布/訂閱)、可靠性、安全。

AMQP 里主要兩個組件:

Exchange和 Queue (在 AMQP 1.0 里還會有變動),如下圖所示,綠色的 X 就是 Exchange ,紅色的是 Queue ,這兩者都在 Server 端,又稱作 Broker ,這部分是 RabbitMQ 實現的,而藍色的則是客戶端,通常有 Producer(生產者) 和 Consumer(消費者) 兩種類型:

iJHzlj.png

官方網站: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的消息

iJbCmq.png

rabbitmqctl list_queues		##查看消息隊列喂為2

在web界面查看消息隊列,可以發現2個消息隊列等待處理:

iJbP00.png

iJbkkT.png

python receive.py			##消費這兩個消息
rabbitmqctl list_queues		##查看隊列已經為0

在web界面查看隊列,也為0了

iJbAtU.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM