python之RabbitMQ簡單使用
阿新 • • 發佈:2020-10-12
1,簡介
RabbitMQ(Rabbit Message Queue)是流行的開源訊息佇列系統,用erlang語言開發。 1.1關鍵詞說明: Broker:訊息佇列伺服器實體。Exchange:訊息交換機,它指定訊息按什麼規則,路由到哪個佇列。
Queue:訊息佇列載體,每個訊息都會被投入到一個或多個佇列。
Binding:繫結,它的作用就是把exchange和queue按照路由規則繫結起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞。
vhost:虛擬主機,一個broker裡可以開設多個vhost,用作不同使用者的許可權分離。
producer:訊息生產者,就是投遞訊息的程式。
consumer:訊息消費者,就是接受訊息的程式。
channel:訊息通道,在客戶端的每個連線裡,可建立多個channel,每個channel代表一個會話任務。 1.2訊息佇列執行機制:
(2)客戶端宣告一個exchange,並設定相關屬性。
(3)客戶端宣告一個queue,並設定相關屬性。
(4)客戶端使用routing key,在exchange和queue之間建立好繫結關係。
(5)客戶端投遞訊息到exchange。 (6)exchange接收到訊息後,就根據訊息的key和已經設定的binding,將訊息投遞到一個或多個佇列裡。 例如下面的例子中都為首次宣告一個佇列!!! 1.3exchange型別: 1.Direct交換機 特點:依據key進行投遞 例如繫結時設定了routing key為”hello”,那麼客戶端提交的訊息,只有設定了key為”hello”的才會投遞到佇列。 2.Topic交換機 特點:對key模式匹配後進行投遞,符號”#”匹配一個或多個詞,符號”*”匹配一個詞 例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。 3.Fanout交換機 特點:不需要key,採取廣播模式,一個訊息進來時,投遞到與該交換機繫結的所有佇列 2.構建環境
pip install pika
3.示例測試
例項的內容就是從send.py傳送訊息到rabbitmq,receive.py從rabbitmq接收send.py傳送的資訊。
P表示produce,生產者的意思,也可以稱為傳送者,例項中表現為send.py;
C表示consumer,消費者的意思,也可以稱為接收者,例項中表現為receive.py;
中間紅色的表示佇列的意思,例項中表現為hello佇列。
#send import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))# 新建連線,rabbitmq安裝在本地則hostname為'localhost' channel = connection.channel()#建立通道 # 宣告一個佇列,生產者和消費者都要宣告一個相同的佇列,用來防止萬一某一方掛了,另一方能正常執行 channel.queue_declare(queue='hello') #n RabbitMQ a message can never be sent directly to the queue, it always needs to go through an exchange. channel.basic_publish(exchange='', routing_key='hello',# routing_key在使用匿名交換機的時候才需要指定,表示傳送到哪個佇列 body = 'Hello World yes') print("[x] Send 'Hello World !'") connection.close()
#receive import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))## 新建連線,rabbitmq安裝在本地則hostname為'localhost' channel = connection.channel()#建立通道 #You may ask why we declare the queue again ‒ we have already declared it in our previous code. # We could avoid that if we were sure that the queue already exists. For example if send.py program #was run before. But we're not yet sure which program to run first. In such cases it's a good # practice to repeat declaring the queue in both programs. channel.queue_declare(queue='hello')# 宣告一個佇列,生產者和消費者都要宣告一個相同的佇列,用來防止萬一某一方掛了,另一方能正常執行 def callback(ch,method,properties,body): print("[x] Received %r"%body) channel.basic_consume(queue='hello',#去hello佇列取訊息 on_message_callback=callback,#開始接受資料,有資料就呼叫callback 方法處理 auto_ack=True) print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming()