RabbitMQ通信模式-Python示例
- 0.RabbitMQ官網通信模式
- 1.Simplest(簡單)模式
- 1.1 發送端
- 1.2 接收端
0.RabbitMQ官網通信模式
1.Simplest(簡單)模式
1.1 發送端
# -*- coding: utf-8 -*-
"""
Author: xxx
date: 2025/5/19 11:30
Description: Simaple簡單模式,生產者簡單的RabbitMQ消息隊列(不安全,不能持久化)
"""import pika# RabbitMQ 服務器地址
rabbitmq_host = '192.168.120.19'
# RabbitMQ 服務器端口
rabbitmq_port = 5672
# RabbitMQ 用戶名
rabbitmq_username = 'rabbitmq'
# RabbitMQ 密碼
rabbitmq_password = 'rabbitmq@123'# 根據用戶名和密碼,創建憑證對象
credentials = pika.PlainCredentials(rabbitmq_username, rabbitmq_password)
# 創建連接參數對象,指定主機、端口、憑證等信息
connection = pika.BlockingConnection(pika.ConnectionParameters(host=rabbitmq_host,port=rabbitmq_port,credentials=credentials)
)
# 創建通道對象
channel = connection.channel()# 定義消息隊列名稱
queue_name = 'hello'
# 聲明消息隊列,如果沒有隊列會自動創建
channel.queue_declare(queue=queue_name
)# 定義消息內容
message = 'Hello, World!'
# 發布消息到消息隊列,routing_key為隊列名稱,body為消息內容,properties為屬性,其中delivery_mode為2表示持久化
channel.basic_publish(exchange='',routing_key=queue_name,body=message
)
print(" [x] Sent '{}'".format(message))# 關閉通道和連接
connection.close()
1.2 接收端
# -*- coding: utf-8 -*-
"""
Author: tanggaomeng
date: 2025/5/19 11:44
Description: Simaple簡單模式,消費者簡單的RabbitMQ消息隊列(不安全,不能持久化)
"""import pika# RabbitMQ 服務器地址
rabbitmq_host = '192.168.120.19'
# RabbitMQ 服務器端口
rabbitmq_port = 5672
# RabbitMQ 用戶名
rabbitmq_username = 'rabbitmq'
# RabbitMQ 密碼
rabbitmq_password = 'rabbitmq@123'# 根據用戶名和密碼,創建憑證對象
credentials = pika.PlainCredentials(rabbitmq_username, rabbitmq_password)
# 創建連接參數對象,指定主機、端口、憑證等信息
connection = pika.BlockingConnection(pika.ConnectionParameters(host=rabbitmq_host,port=rabbitmq_port,credentials=credentials)
)
# 創建通道對象
channel = connection.channel()# 定義消息隊列名稱
queue_name = 'hello'
# 聲明消息隊列,如果沒有隊列會自動創建
channel.queue_declare(queue=queue_name
)# 將ReceivedMessage添加到隊列中,同時替換通道實現。
# 返回的結果,會返回到這里面,如果有興趣可以點開basic_consume方法去看看源代碼
# 訂閱消息隊列,設置自動應答(auto_ack=False),并指定回調函數
def callback(ch, method, properties, body):print(" [x] Received %r" % (body,))# 從服務器隊列中消費
# no_ack=True ,是需要是否確定消息的處理了,告訴服務端
# no_ack=False ,默認是False,可以不寫
channel.basic_consume(queue=queue_name, on_message_callback=callback, auto_ack=False)print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()'''
注意:接收到處于死循環,一直在等待接收,發送一個數據,就收到一個數據
'''
基于上面的代碼不做任何修改
把上面的消費者開N個就是想要的結果。
如下:
運行3個消費者,生產者生成的消息隊列依次被接收者接收,每次只有一個消費者接收到信息,3個消費者接收順序依次進行
參考:
https://www.rabbitmq.com/tutorials