RabbitMQ學習筆記(一)

What is RabbitMQ####

RabbitMQ是一個消息代理、一個消息系統(tǒng)的媒介祟滴。他可以提供一個通用的消息發(fā)送和接收平臺,并且保證消息在傳輸?shù)倪^程中的安全。
注:使用pika Python客戶端

核心理念####

RabbitMQ核心就是接收和發(fā)送消息瘤睹,我們可以將它想象成一個郵局,我們把信件放在郵箱中答倡,郵遞員會將信件投遞到你填寫的收件人哪里轰传。

寄信

在這個比喻中,RabbitMQ就扮演著郵箱瘪撇、郵局和郵遞員的角色获茬。
但是區(qū)別就是RabbitMQ處理的是消息(message)這種二進制數(shù)據。

RabbitMQ中專有名詞####

  • 生產者(Producing):就是消息產生的一方倔既。發(fā)送消息的程序就是一個生產者恕曲。一般使用"P"表示。
    Producing
  • 隊列(Queue)就是郵箱的名稱渤涌。消息通過應用程序和RabbitMQ進行傳輸佩谣,這些消息能夠存儲在一個隊列中,隊列沒有限制实蓬,基本上是一個無限的緩沖茸俭,但是過多的消息積累也會讓RabbitMQ的性能下降。
    多個生產者能將消息發(fā)送到一個隊列中安皱,多個消費者也能從同一個隊列中取消息调鬓。
    Queue
  • 消費者(Consuming)和獲取消息是一個意思。一個消費者就是一個等待獲取消息的程序酌伊。通常把它繪制成"C"腾窝。
    Consuming

Hello World!####

我們需要編寫兩個程序居砖,一個程序將"Hello World!"發(fā)送到隊列中(這句話說的不夠嚴謹虹脯,生產者是不能直接將消息發(fā)送到隊列中的),然后另一個程序從隊列中取出后并打印消息內容奏候。

RabbitMQ庫#####

RabbitMQ使用的是AMQP協(xié)議循集。要使用它就不洗使用一個使用相同協(xié)議的庫。python中有一個庫叫做pika鼻由。
安裝pika庫(Linux)

$ sudo pip install pika
發(fā)送消息#####
SendMessage

file_name: send.py
第一個程序send.py會發(fā)送一個消息到隊列中。首先建立一個到RabbitMQ服務器的連接connection厚棵。

# coding:utf-8
import pika

# 創(chuàng)建一個與RabbitMQ服務器的連接
connection=pika.BlockingConnection(pika.ConnectionParam(
               'localhost')) 
channel = connection.channel()  

現(xiàn)在我們已經連接上服務器蕉世,在發(fā)送消息前我們需要確認隊列是存在的,如果我們把消息發(fā)送一個不存在的隊列婆硬,RabbitMQ會丟棄消息狠轻,我們先創(chuàng)建一個名字為hello的隊列,然后將消息發(fā)送到這個隊列彬犯。

# 創(chuàng)建了一個名字為hello的隊列
channel.queue_declare(queue='hello') 

已經創(chuàng)建了一個隊列向楼,現(xiàn)在可以將第一條消息發(fā)送到隊列了查吊,我們發(fā)送一個字符串。

# 發(fā)送消息的函數(shù)湖蜕,excheng參數(shù)是交換機逻卖;
# routing_key是隊列的名字;body是發(fā)送消息的內容昭抒。
channel.basic_publish(exchange=' ',
        routing_key = 'hello',
        body = 'Hello World!')
print ' [x] Sent 'Hello World!'

退出程序之前评也,我們需要確認網絡緩沖已經被刷寫,消息已經投遞到RabbitMQ中灭返,完成這件事情可以這樣

connection.close()
獲取消息#####
GetMessage

我們第二個程序是獲取隊列中的消息盗迟,并打印消息。
在從隊列中獲取消息時熙含,首先也是先連接到RabbitMQ服務器還要確定要獲取消息的隊列是已經存在的隊列罚缕。

# 前面創(chuàng)建連接的代碼和上面是一樣的
channel.queue_declare(queue='hello')

為什么要重復聲明隊列呢?剛在發(fā)送的時候就已經創(chuàng)建隊列了怎静,再次創(chuàng)建會不會是兩個隊列邮弹?之所以創(chuàng)建兩次是因為我們的發(fā)送和接收程序不知道哪一個先運行,如果接收程序中沒有創(chuàng)建隊列消约,先于發(fā)送程序運行肠鲫,就會出現(xiàn)接收消息的隊列不存在。

列出所有隊列#####
$ sudo rabbitmqctl list_queues

在windows中進入rabbitMQ Server的sbin目錄下打開cmd運行rabbitmqctl list_queues
從隊列中獲取消息需要為隊列定義一個回調函數(shù)(callback)或粮。當我們獲取消息的時候就會調用這個回調函數(shù)导饲。這個回掉函數(shù)將接收到的消息輸出到屏幕上。

def callback(ch, method, properties, body):
      print " [x] Received %r" % (body, )  

下一步氯材,我們需要告訴RabbitMQ這個回調函數(shù)將會從名字為'hello'的隊列中接收消息渣锦。

# queue參數(shù)是隊列的名字;no_ack參數(shù)暫時不知何用
channel.basic_consume(callback,
       queue='hello',
        no_ack=True)

最后氢哮,我們輸入一個用來等待消息數(shù)據并且在需要的時候運行回調函數(shù)的無限循環(huán)袋毙。

print ' [*] Waiting for message. To exit press CRTL+C'
channel.start_consuming() # 開始循環(huán)
整合#####

send.py

# codin:utf-8
import pika

connection=pika.BlockingConnection(pika.ConnectionParam(
        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() 

receiver.py

# coding:utf-8
import pika

connection=pika.BlockingConnection(pika.ConnectionParaer(
        host='localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

print ' [*] Waiting for messages. To exit press CTRL+C'

def callback(ch, method, properties, body):
    print " [x] Received %r" % (body,)

channel.basic_consume(callback,
                      queue='hello',
                      no_ack=True)

channel.start_consuming()  
運行#####
running

從上面的運行結果看,生產者發(fā)送的消息成功被消費者接收冗尤。

待續(xù)听盖。。裂七。####

參考文章http://wiki.jikexueyuan.com/project/rabbitmq/hello-world.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末皆看,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子背零,更是在濱河造成了極大的恐慌腰吟,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徙瓶,死亡現(xiàn)場離奇詭異毛雇,居然都是意外死亡嫉称,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門灵疮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來织阅,“玉大人,你說我怎么就攤上這事始藕∑盐龋” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵伍派,是天一觀的道長江耀。 經常有香客問我,道長诉植,這世上最難降的妖魔是什么祥国? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任导狡,我火速辦了婚禮荒典,結果婚禮上,老公的妹妹穿的比我還像新娘剖效。我一直安慰自己灼擂,他們只是感情好壁查,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剔应,像睡著了一般睡腿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上峻贮,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天席怪,我揣著相機與錄音,去河邊找鬼纤控。 笑死挂捻,一個胖子當著我的面吹牛,可吹牛的內容都是我干的船万。 我是一名探鬼主播刻撒,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耿导!你這毒婦竟也來了声怔?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤碎节,失蹤者是張志新(化名)和其女友劉穎捧搞,沒想到半個月后抵卫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狮荔,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡胎撇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了殖氏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晚树。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖雅采,靈堂內的尸體忽然破棺而出爵憎,到底是詐尸還是另有隱情,我是刑警寧澤婚瓜,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布宝鼓,位于F島的核電站,受9級特大地震影響巴刻,放射性物質發(fā)生泄漏愚铡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一胡陪、第九天 我趴在偏房一處隱蔽的房頂上張望沥寥。 院中可真熱鬧,春花似錦柠座、人聲如沸邑雅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淮野。三九已至,卻和暖如春狂塘,著一層夾襖步出監(jiān)牢的瞬間录煤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工荞胡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妈踊,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓泪漂,卻偏偏與公主長得像廊营,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子萝勤,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理露筒,服務發(fā)現(xiàn),斷路器敌卓,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 來源 RabbitMQ是用Erlang實現(xiàn)的一個高并發(fā)高可靠AMQP消息隊列服務器慎式。支持消息的持久化、事務、擁塞控...
    jiangmo閱讀 10,346評論 2 34
  • 關于消息隊列瘪吏,從前年開始斷斷續(xù)續(xù)看了些資料癣防,想寫很久了,但一直沒騰出空掌眠,近來分別碰到幾個朋友聊這塊的技術選型蕾盯,是時...
    預流閱讀 584,520評論 51 785
  • RabbitMQ 原理介紹及安裝部署 標簽:RabbitMQ 安裝 簡介 RabbitMQ 是一個用 Erlang...
    神仙CGod閱讀 8,560評論 0 60
  • 什么叫消息隊列 消息(Message)是指在應用間傳送的數(shù)據。消息可以非常簡單蓝丙,比如只包含文本字符串级遭,也可以更復雜...
    lijun_m閱讀 1,340評論 0 1