Python操作RabbitMQ初體驗
由於想用Python實現一套分散式系統,來管理和監控CDN的內容與執行狀態,誤打誤撞認識了RabbitMQ,推薦的人很多,如餘鋒《我為什麼要選擇RabbitMQ》等等。
在MQ這個詞彙映入眼簾的時候,我花了好幾個小時去閱讀什麼是MQ,即Message Queue(訊息佇列)。顧名思義,訊息佇列,裝滿訊息的佇列,佇列,資料結構名詞,具備先進先出特性的一種資料結構。訊息佇列無非是用來傳遞訊息的而已,那麼其意義何在,應用場景又在哪裡,具備什麼特性,及其獨特優勢是什麼,為什麼要用,這些都是浮現在我腦海中的一連串問題。
經過一大串搜尋,終於膚淺的理解訊息佇列是應用對應用的資訊傳遞的通訊方式。比如需要分析多臺伺服器的日誌,完全可以每臺伺服器都用一個程序往一個
概念上說,RabbitMQ是AMPQ(高階訊息協議佇列)的標準實現,據說不熟悉AMQP,會看不懂RabbitMQ的文件。但是也只能建大的理解關鍵概念了。整個RabbitMQ的實現原理模型見下圖,其實就是一個帶路由任務分發佇列的生產者與消費者模型。如圖所示,即生產者生產出相應的資訊,傳送給路由器,路由器根據資訊中的關鍵Key資訊,將資訊分發到不同的訊息佇列中,再由消費者去不同的訊息佇列中讀取資料的過程。
Broker:簡單來說就是訊息佇列伺服器實體。
Exchange:訊息交換機,它指定訊息按什麼規則,路由到哪個佇列。
Queue:訊息佇列載體,每個訊息都會被投入到一個或多個佇列。
Binding:繫結,它的作用就是把exchange和queue按照路由規則繫結起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞。
vhost:虛擬主機,一個broker裡可以開設多個vhost,用作不同使用者的許可權分離。
PRoducer:訊息生產者,就是投遞訊息的程式。
consumer:訊息消費者,就是接受訊息的程式。
channel:訊息通道,在客戶端的每個連線裡,可建立多個channel,每個channel代表一個會話任務。
訊息佇列的使用過程大概如下:
(1)客戶端連線到訊息佇列伺服器,開啟一個channel。
(2)客戶端宣告一個exchange,並設定相關屬性。
(3)客戶端宣告一個queue,並設定相關屬性。
(4)客戶端使用routing key,在exchange和queue之間建立好繫結關係。
(5)客戶端投遞訊息到exchange。
瞭解了RabbitMQ大概流程與優勢之後,我開始在自己的Fedora上進行RabbitMQ的試用。
點選可以下載各個版本的binary包,我下載了rabbitmq-server-3.3.0-1.noarch.rpm
進入下載路徑,/home/sun5495/Downloads/
[[email protected] Downloads]# sudo chmod 777 rabbitmq-server-3.3.0-1.noarch.rpm
更改可執行檔案許可權,增加執行許可權。
然後執行./rabbitmq-server-3.3.0-1.noarch.rpm,執行報錯,無法安裝。
原來是現需要安裝Erlang才可以,試用此命令 yum install erlang 搞定。
然後使用root使用者執行
rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc yum install rabbitmq-server-3.3.0-1.noarch.rpm
安裝成功。
為了設定RBMQ開機啟動,使用管理員賬戶執行
chkconfig rabbitmq-server on
開啟和關閉server使用命令
/sbin/service rabbitmq-server stop/start
結果開啟的時候報錯如下
Starting rabbitmq-server (via systemctl): Job for rabbitmq-server.service failed. See ‘systemctl status rabbitmq-server.service’ and ‘journalctl -xn’ for details. [FAILED]
使用journalctl -xn命令開啟日誌,查看了下貌似是Erlang的某個檔案拒絕訪問,然後還提出了一大堆建議。
嘗試一下
grep beam.smp /var/log/audit/audit.log | audit2allow -M mypol semodule -i mypol.pp /sbin/service rabbitmq-server start
居然奇蹟般成功。好吧,待我一會回來研究剛才做了什麼。
既然RabbitMQ安裝也執行成功了,那麼我就來嚐嚐RabbitMQ的鮮吧。就從官網上的例子一步一筆來做好了。
由於我使用的是Python,那麼就需要安裝一些支援RabbitMQ的庫來進行操作,其中包括
py-amqplib,txAMQP,pika這幾種,按照官網的tutorial,我也安裝了pika。
pip install pika
從最簡單的收發訊息開始。即一端傳送訊息,一端接收訊息。
傳送方即生產者,首先要建立與RabbitMQ伺服器的連線,
#!/usr/bin/env python import pika connection = pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel = connection.channel()
此處伺服器連線本地localhost,也可以指定ip或者主機名。
其次傳送方需要宣告一個佇列,比如命名為sayhello
channel.queue_declare(queue='sayhello')
此時我們就可以傳送訊息了。由於第一個小案例比較簡單,沒有經過路由器,因此傳送訊息時,指定路由為空即可。
channel.basic_publish(exchange='', routing_key='hello', body='hello world') print "Sent ‘hello world'"
最後關閉連線即可。
connection.close()
接收方即消費者,需要從佇列上獲取資料,因此也需要繫結一個佇列
channel.queue_declare(queue='hello')
同時,由於接收方的工作方式是基於佇列的訊息執行一個回撥函式,當收到訊息時,Pika就會執行相應的回撥函式,因此我們需要定義此函式。
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()
OK執行成功。
接下來就逐步的深入體驗RabbitMQ的獨特魅力。
/*學院顯示頁 內容下*/ var cpro_id = "u2659928";
相關推薦
Python操作RabbitMQ初體驗
/*學院顯示頁 左上*/ var cpro_id = "u2659916"; 由於想用Python實現一套分散式系統,來管理和監控CDN的內容與執行狀態,誤打誤撞認識了RabbitMQ,推薦的人很多,如餘鋒《我為什麼要選擇RabbitMQ》等等。 在MQ這個詞彙映入眼簾的時候,
python 操作RabbitMQ
ack 模糊匹配 host star cal top con 消失 nbsp pip install pika 使用API操作RabbitMQ 基於Queue實現生產者消費者模型 View Code 對於RabbitMQ來說,生產和消費不再針對內存裏的一個Queue
Python操作rabbitmq系列(一)
targe 紅色 入門 web 之間 cap ssa 隊列 技術 從本文開始,接下來的內容,我們將討論rabbitmq的相關功能。我的這些文章,最終是要實現一個項目(具體是什麽暫不透露)。前面每一篇,都是在為這個系統做準備。rabbitmq,是我們這個項目的關鍵部分之一。所
Python操作rabbitmq系列(三):多個接收端消費消息
name 連接 logs http clas header 消費者 exclusive pub 接著上一章。這一章,我們要將同一個消息發給多個客戶端。這就是發布訂閱模式。直接看代碼: 發送端: import pikaimport sysconnection = pika.B
python操作RabbitMQ
相關 cred 開源 callback 進行 偶數 生產者 開源協議 erro 介紹 RabbitMQ是一個在AMQP基礎上完整的,可復用的企業消息系統。他遵循Mozilla Public License開源協議。 MQ全稱為Message Queue, 消息隊列(MQ
Python操作rabbitmq系列(六):進行RPC調用
block 異常 遠程 轉換 調用 成了 mage chang 多少 此刻,我們已經進入第6章,是官方的最後一個環節,但是,並非本系列的最後一個環節。因為在實戰中還有一些經驗教訓,並沒體現出來。由於馬上要給同事沒培訓celery了。我也來不及寫太多。等後面,我們再慢慢補充。
Python操作rabbitmq系列(五):根據主題分配消息
method type 同時 elephant com .info err 現在 bin 接著上一章,使用exchange_type=‘direct‘進行消息傳遞。這樣消息會完全匹配後發送到對應的接收端。現在我們想幹這樣一件事: C1獲取消息中包含:orange內容的消息,
python操作rabbitmq實現廣播效果
連接 lba cti all rec alt aid tin back 生產方(Fanout_Publisher.py) 1 # __author__ = ‘STEVEN‘ 2 import pika 3 #開啟socket 4 connection = pik
python - 操作RabbitMQ
https://www.cnblogs.com/pangguoping/p/5720134.html 介紹 RabbitMQ是一個在AMQP基礎上完整的,可複用的企業訊息系統。他遵循Mozilla Public License開源協議。MQ全稱為Message Queue, 訊息佇列(MQ
RabbitMQ 初體驗
概述 RabbitMQ是一款訊息佇列中介軟體。他提供了幾乎覆蓋所有語言的SDK與文件,簡直強大的不的了。要詳細的去了解學習RabbitMQ,我建議還是看官方文件吧。 http://www.rabbitmq.com/getst... 訊息佇列有以下幾個基本用途
Laravel5.2使用RabbitMQ初體驗
由於最近需要使用rabbitmq來進行訊息佇列的讀取,但以前從來都沒有接觸過這等高深的技術,所以只好從頭開始研究,下面就把這幾周的成果分享出來,針對沒有接觸過訊息佇列的同學,希望能給你們一些幫助。 安裝rabbitmq 使用composer安裝lar
Python--面向物件初體驗
面向過程 面向過程:核心是過程二字,過程即解決問題的步驟 基於該思想寫程式就類似流水線 優點:複雜的過程簡單化 缺點:擴充套件性差 面向物件 面向過程的程式設計的核心是過程(流水線式思維),過程即解決問題的步驟,面向過程的設計就好比精心設計好一條流水線,考慮周全什麼時候處理什麼東西。 優點是:極大的降
Qt for Python 5.12初體驗
Qt for Python 5.12初體驗 2018年12月18日,Qt在其部落格上宣佈Qt for Python 5.12正式釋出,按照其幫助文件的說明,嘗試運行了第一個小例子。首先需要安裝Python 3.5+ or 2.7和for Qt 5.12,安裝完成之後邊可以輸入程式碼編譯運行了。複製自Qt示例
python自動化的初體驗——變數及字串資料型別
python程式碼學習初體驗——葉子 1.python 的變數和資料型別 hello world 簡單的變數 變數名、檔名的命名規則 變數的定義 2.python 的資料型別——字串及其函式的使用方法
python初體驗
list python 字典 python初體驗:1.python種類 CPython 代碼 -> C字節碼 -> 機器碼 (一行一行) pypy 代碼 -> C字節碼 -> 機器碼 全部轉換完 -> 執行 其他Python 代碼 -&g
python的初體驗
多行註釋 導致 passwd 判斷語句 swd pytho 對齊 輸入 tab 最近由於畢業答辯,導致一些博客沒有更新,見諒,今天我們開始一些新的內容 1.python的註釋 單行註釋:# 多行註釋: ‘‘‘ 這是多行註釋
python-paramiko初體驗
param sed 小試牛刀 sys policy .org anaconda blank all 什麽pexpect、pxshll在paramiko面前都是浮雲,重要的是paramiko支持windows。 小試牛刀 import paramiko paramiko.
python語言初體驗
很難 體重 這也 有趣的 我們 但是 似的 之前 設計 在學習這門程序設計語言之前,對python語言沒有過了解,認為是和c語言類似的一種程序設計語言,當時c語言學的很吃力,學習的效果也並不好。因為c語言留下的陰影,在上課之前是有些忐忑的,但是在上了兩次課之後發現目前看來p
python爬蟲之Splash使用初體驗
ans 服務器 wid ajax tor 為什麽 安裝 異步 理由 Splash是什麽: Splash是一個Javascript渲染服務。它是一個實現了HTTP API的輕量級瀏覽器,Splash是用Python實現的,同時使用Twisted和QT。Twisted(QT
Python大數據與機器學習之NumPy初體驗
clas 自己 入門 left ray spark AC DC 精通 本文是Python大數據與機器學習系列文章中的第6篇,將介紹學習Python大數據與機器學習所必須的NumPy庫。 通過本文系列文章您將能夠學到的知識如下: 應用Python進行大數據與機器學習