RabbitMQ學習小結(一)—— Hello World [Python]

1. RabbitMQ介紹

本文所有客戶端全部是基於Python,根據官網可以看出,Python有好幾個擴展包可以使用:
RabbitMQ是一個消息代理。它的核心原理非常簡單:接收和發送消息。RabbitMQ將發送消息和接收消息進行解耦,由此來實現應用程序的異步處理。如果將RabbitMQ視爲一個服務,從大方向來看,RabbitMQ做了三件事情:
1.  收取請求
2.  存儲請求信息
3.  分發請求
引用官網原文,你可以把它想像成一個郵局:你把信件放入郵箱,郵遞員就會把信件投遞到你的收件人處。在這個比喻中,RabbitMQ就扮演着郵箱、郵局以及郵遞員的角色。

2. 名詞解釋

生產(Prouducing)意思就是發送,發送消息的應用程序就是一個(Prouducer),一般用“P”表示。
隊列(Queue),生產者將消息發送給RabbitMQ,是指發送給RabbitMQ的一個隊列。多個生產者可以同時給一個隊列發送消息,同時多個消費者也可以同時從隊列取消息。
消費者(Consuming)就是接收消息。一個消費者(Consumer)就是一個等待接收消息的應用程序

3. Hello World

Hello World實現一個最簡單的程序,即一個生產者發送一條消息到RabbitMQ的隊列,然後消費者讀取消息並輸出到屏幕上。基本邏輯是生產者(producer)把消息發送到一個名爲“hello”的隊列中。消費者(consumer)從這個隊列中獲取消息。
RabbitMQ使用的是AMQP協議。要使用她你就必須需要一個使用同樣協議的庫。python可以從以下幾個庫中選擇,我們這裏選擇的是pika,和官網的例子是一致的。
使用Python自帶工具pip進行安裝,如何安裝pip,可參考我的另外一篇如何搭建Python環境
安裝pika
[tRabbitMQ@iZ250x18mnzZ ~]$ pip install pika==0.95
Downloading/unpacking pika==0.95

發送消息程序

前面提到的生產者,也就是發送消息程序,分爲以下幾步處理:
1. 創建連接RabbitMQ服務
2. 建立通道
3. 創建隊列
4. 發送消息
5. 關閉連接
整合代碼如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2016-02-28 21:28:17
# @Author  : mx ([email protected])
# @Link    : http://www.shujutiyu.com/
# @Version : $Id$

import os
import pika

conn = None

try:
    # 獲取連接
    conn = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    # 獲取通道
    channel = conn.channel()

    # 在發送隊列前,需要確定隊列是否存在,如果不存在RabbitMQ將會丟棄,先創建隊列
    channel.queue_declare('hello')

    # 在RabbitMQ中發送消息,不是直接發送隊列,而是發送交換機(exchange),此處不多做研究,後面系列逐漸深入
    ret = channel.basic_publish(exchange='',
                                routing_key='hello',
                                body="Hello, World!")
    print " [x] Sent 'Hello World!'"
    print ret
except Exception, e:
    raise e
finally:
    if conn:
        conn.close()

接收消息程序

前面提到的消費者,也就是接收消息程序,分爲以下幾步處理:
1. 創建連接
2. 建立通道
3. 創建隊列(爲防止隊列不存在,隊列存在也不會重新創建)
4. 接收消息(接收消息需要一個回調函數)
5. 啓動程序,輪詢等待消息
整合代碼如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2016-02-29 16:30:21
# @Author  : mx ([email protected])
# @Link    : http://www.shujutiyu.com/
# @Version : $Id$

import os
import pika

conn = None


def callback(ch, method, properties, body):
    """
        out body
    """
    print " [x] Recived ch {0}".format(ch)

    print " [x] Recived method {0}".format(method)

    print " [x] Recived properties {0}".format(properties)

    print " [x] Recived %r" % (body, )

try:
    # get connection
    conn = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost')
    )

    # get channel
    channel = conn.channel()

    # declare queue, 重複聲明不會報錯,但是沒有隊列的話直接取用會報錯
    channel.queue_declare('hello')

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

    print ' [*] Waiting for messages. To exit press CTRL+C'
    channel.start_consuming()
except Exception, e:
    raise e
finally:
    if conn:
        conn.close()
注:關於回調函數的參數,後面用到的時候再逐個解析。
運行發送消息程序
[tRabbitMQ@iZ250x18mnzZ src]$ python send_helloworld.py 
 [x] Sent 'Hello World!'
True
運行接收消息程序
[tRabbitMQ@iZ250x18mnzZ src]$ python recv_helloworld.py 
 [*] Waiting for messages. To exit press CTRL+C
 [x] Recived ch <pika.adapters.blocking_connection.BlockingChannel object at 0x7f61ecc6fa90>
 [x] Recived method <Basic.Deliver(['consumer_tag=ctag1.6c2c709930904468b40d0e1a758f7aca', 'delivery_tag=1', 'exchange=', 'redelivered=False', 'routing_key=hello'])>
 [x] Recived properties <BasicProperties>
 [x] Recived 'Hello, World!'
運行程序啓動後,一直在等待獲取消息,可以通過Ctrl-C來中止。Hello World基本就結束了,基本知道RabbitMQ基本的使用方法,後續將會進一步對RabbitMQ的使用場景進行解析。

參考資料:

發佈了37 篇原創文章 · 獲贊 127 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章