1. 程式人生 > >一、消息隊列介紹與RabbitMQ基本示例

一、消息隊列介紹與RabbitMQ基本示例

情況 routing 示例 兩個 lba 生產者 src 客戶端 應用

Python裏面的消息機制是QUEUE,它與RabbitMQ幹的事情是一樣的,都是消息隊列。QUEUE是傳遞消息的,典型的應用場景就是生產者、消費者模型。那麽RabbitMQ到底與Python裏的QUEUE有什麽區別呢? Python裏的QUEUE分為"線程QUEUE"和進程"QUEUE",線程QUEUE只能夠在不同線程之間進行交互,它不能跨進程;那進程QUEUE使用於父進程與子進程之間進行交互或者同屬於同一父進程下的多個子進程之間進行交互。現在問題來了,如果兩個獨立的程序(進程),比如說python和java(生產者/消費者模式),這時候用QUEUE是不能滿足這種場景需求的,現在就要使用RabbitMQ了。

技術分享圖片
RabbitMQ的工作模式如上圖所示,比如我兩個獨立的進程(QQ和word),兩個進程間要想實現通信的話,可以借助磁盤,兩個進程把消息寫到磁盤再互相去讀取,但是這樣效率太低;還有一種辦法就是自己寫socket,這樣做的話就是維護起來比較困難,還得處理一些粘包的問題;第三種辦法就是采用一個中間的代理,兩個進程都去連接這個代理,由代理去處理這些東西,有的夥伴會說,那還不如自己寫socket呢。。。現在我要說,這個代理它是把socket封裝好的,你使用起來就像直接send(XXX)就好了,不需要你再去考慮一些粘包問題和各種程序邏輯問題,而且如果有第三個進程(微信),只需要連接就好了,現在這個中間件的產品有RabbitMQ、ZeroMQ、ActiveMQ等等

    
    實現一個最簡單的隊列通信

技術分享圖片



我是在win7上面安裝的RabbitMQ,查看百度東拼西湊把服務安裝好,有些亂,晚一些再把安裝步驟整理出來。。。。

    
    接下來實現一下生產者端,代碼的含義看註釋:
import os

BASE_DIR = os.path.dirname(os.path.abspath(file))
import pika

#top1:此步驟只是建立了一個scoket,只是代表原生socket寫好了
connection = pika.BlockingConnection(pika.ConnectionParameters(
‘localhost‘))

#top2:聲明一個管道,在管道裏發消息

channel = connection.channel()

# top3:在管道裏聲明queue,管道相當於路,路上得跑queue(隊列)車
channel.queue_declare(queue=‘exclusive‘)

# top4:開始發消息,註意看是在管道裏發消息
channel.basic_publish(exchange=‘‘,
routing_key=‘exclusive‘, #queue名稱
body=‘Let s go!‘) #消息內容

connection.close() #關閉隊列,不需要關閉管道

消費者端
import os
BASE_DIR = os.path.dirname(os.path.abspath(file))
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
‘localhost‘))
channel = connection.channel()

# 生產者和消費者都聲明了隊列,因為我們不知道誰先執行程序,如過客戶端先執行但是沒有聲明隊列的情況下會報錯,聲明一下會避免這種錯誤
channel.queue_declare(queue=‘exclusive‘)

#ch是管道的內存地址;method包含要把消息發給誰,發到哪個queue等信息;body是消息內容
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)



channel.basic_consume(#消費消息
callback, #如果收到消息,就調用callback函數來處理消息
queue=‘exclusive‘,
no_ack=True)
#此處的start只要一起動就一直運行了,因為它不止收一條
channel.start_consuming()

最後啟動發送端和接收端程序看效果。

一、消息隊列介紹與RabbitMQ基本示例