1. 程式人生 > >Python操作RabbitMQ初體驗

Python操作RabbitMQ初體驗

/*學院顯示頁 左上*/ var cpro_id = "u2659916";

由於想用Python實現一套分散式系統,來管理和監控CDN的內容與執行狀態,誤打誤撞認識了RabbitMQ,推薦的人很多,如餘鋒《我為什麼要選擇RabbitMQ》等等。

在MQ這個詞彙映入眼簾的時候,我花了好幾個小時去閱讀什麼是MQ,即Message Queue(訊息佇列)。顧名思義,訊息佇列,裝滿訊息的佇列,佇列,資料結構名詞,具備先進先出特性的一種資料結構。訊息佇列無非是用來傳遞訊息的而已,那麼其意義何在,應用場景又在哪裡,具備什麼特性,及其獨特優勢是什麼,為什麼要用,這些都是浮現在我腦海中的一連串問題。

經過一大串搜尋,終於膚淺的理解訊息佇列是應用對應用的資訊傳遞的通訊方式。比如需要分析多臺伺服器的日誌,完全可以每臺伺服器都用一個程序往一個

MySQL資料庫的表裡面寫入資料,即所需要的資訊,然後再寫幾個程序,讀取表裡資料,進行資料分析不是挺好,不過很快,這種設計的醜陋之處就顯現出來了…… 你想要多個程式從一個隊列當中取資料來處理?沒問題,我們硬編碼程式的個數好了……什麼?還要能夠允許程式動態地增加和減少的時候動態進行壓力分配?這是很流行的《RabbitMQ+Python入門經典 兔子和兔子窩》裡面的例子。想想也是,當我的CDN傳輸來一大堆資料的時候,資料的分發,處理,所有的一切都會是問題。但是其實還是沒明白,Rabbit到底是怎麼樣實現這些東西的。

概念上說,RabbitMQ是AMPQ(高階訊息協議佇列)的標準實現,據說不熟悉AMQP,會看不懂RabbitMQ的文件。但是也只能建大的理解關鍵概念了。整個RabbitMQ的實現原理模型見下圖,其實就是一個帶路由任務分發佇列的生產者與消費者模型。如圖所示,即生產者生產出相應的資訊,傳送給路由器,路由器根據資訊中的關鍵Key資訊,將資訊分發到不同的訊息佇列中,再由消費者去不同的訊息佇列中讀取資料的過程。

image_thumb1

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的試用。

image_thumb4

點選可以下載各個版本的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

居然奇蹟般成功。好吧,待我一會回來研究剛才做了什麼。

image_thumb8

既然RabbitMQ安裝也執行成功了,那麼我就來嚐嚐RabbitMQ的鮮吧。就從官網上的例子一步一筆來做好了。

由於我使用的是Python,那麼就需要安裝一些支援RabbitMQ的庫來進行操作,其中包括

py-amqplib,txAMQP,pika這幾種,按照官網的tutorial,我也安裝了pika。

pip install pika

從最簡單的收發訊息開始。即一端傳送訊息,一端接收訊息。

image_thumb11

傳送方即生產者,首先要建立與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進行大數據與機器學習