ホームページ >バックエンド開発 >Python チュートリアル >PythonでRabbitMQを操作してみる(1)

PythonでRabbitMQを操作してみる(1)

黄舟
黄舟オリジナル
2017-01-17 14:47:561420ブラウズ

CDN のコンテンツと稼働状況を管理および監視する分散システムを Python を使用して実装したいと考えていたため、偶然、Yu Feng 氏の「RabbitMQ を選択する理由」など、多くの人に勧められました。等々。

MQ という言葉が登場したとき、私は MQ とは何か、つまり Message Queue (メッセージ キュー) について数時間かけて読みました。名前が示すように、メッセージ キュー、メッセージで満たされたキュー、キュー、データ構造名詞は、先入れ先出しの特性を持つデータ構造です。メッセージ キューはメッセージを配信するために使用されるだけなので、その重要性は何なのか、そのアプリケーション シナリオは何なのか、どのような特徴があるのか​​、独自の利点は何なのか、なぜ使用する必要があるのか​​など、一連の疑問が生じます。私の心には。

何度も検索した結果、メッセージキューはアプリケーション間で情報を転送するための通信方法であるという表面的な理解に達しました。たとえば、複数のサーバーのログを分析する必要がある場合、各サーバーで 1 つのプロセスを使用してデータ (必要な情報) を Mysql データベース テーブルに書き込み、その後、そのデータを読み取るための複数のプロセスを作成できます。分析はあまり良くありませんが、すぐにこの設計の醜さが明らかになりました... 複数のプログラムでキューからデータを取得して処理したいですか?問題ありません。プログラムの数をハードコードしました...何ですか?また、圧力が動的に増減するときに、プログラムが動的に圧力を分散できるようにしますか?これは、非常に人気のある「RabbitMQ+Python Introduction to Classic Rabbit and Rabbit Nest」の例です。考えてみてください。CDN が大量のデータを送信すると、データの配布、処理、すべてが問題になります。しかし、Rabbit がこれらをどのように実装しているのかはまだ理解できません。

概念的に言うと、RabbitMQ は AMPQ (Advanced Message Protocol Queuing) の標準実装です。AMQP に詳しくない人は RabbitMQ のドキュメントを理解できないと言われています。しかし、重要な概念をしっかりと理解することしかできません。 RabbitMQ の実装原理モデル全体を次の図に示します。これは、実際にはルーティング タスク分散キューを備えたプロデューサーおよびコンシューマー モデルです。図に示すように、プロデューサは対応する情報を生成してルータに送信し、ルータは情報内のキー情報に基づいて情報を異なるメッセージ キューに配布し、コンシューマは異なるメッセージ キュー内のデータを読み取ります。の。

PythonでRabbitMQを操作してみる(1)

ブローカー: 簡単に言えば、これはメッセージキューサーバーエンティティです。
Exchange: メッセージスイッチ。どのメッセージがどのキューにルーティングされるかに従ってルールを指定します。
キュー: メッセージキューキャリア、各メッセージは 1 つ以上のキューに入れられます。
バインディング:バインディング、その機能は、ルーティングルールに従ってExchangeとQueueをバインドすることです。
ルーティング キー: ルーティング キーワード、Exchange はこのキーワードに基づいてメッセージを配信します。
vhost: 仮想ホスト。ブローカーで複数の vhost を開いて、異なるユーザーの権限を分離できます。
プロデューサー:メッセージプロデューサーはメッセージを届けるプログラムです。
コンシューマ: メッセージコンシューマは、メッセージを受け入れるプログラムです。
チャネル: クライアントの各接続で複数のチャネルを確立でき、各チャネルがセッション タスクを表します。

メッセージキューの使用手順は大まかに以下のとおりです。

(1) クライアントはメッセージキューサーバーに接続し、チャネルを開きます。
(2) クライアントは交換を宣言し、関連する属性を設定します。
(3) クライアントはキューを宣言し、関連する属性を設定します。
(4) クライアントはルーティング キーを使用して、Exchange と Queue の間のバインディング関係を確立します。
(5)クライアントは交換するメッセージを配信します。

RabbitMQ の一般的なプロセスと利点を理解した後、Fedora で RabbitMQ を試し始めました。

RabbitMQ公式Webサイトによると、インストールはここからダウンロードする必要があります

http://www.rabbitmq.com/download.html

PythonでRabbitMQを操作してみる(1)


クリックして各バージョンのバイナリパッケージをダウンロードしてくださいRabbitmq-server-3.3.0-1.noarch.rpm をダウンロードしました

ダウンロード パス、/home/sun5495/Downloads/

[sun5495@localhost 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

サーバーの開閉コマンド

/sbin/service rabbitmq-server stop/start

を実行します。その結果、開くときに次のエラーが表示されます
Rabbitmq-server (systemctl 経由) の起動: ジョブ詳細については、「systemctl status Rabbitmq-server.service」および「journalctl -xn」を参照してください。

使用journalctl -xn命令打开日志,查看了下貌似是Erlang的某个文件拒绝访问,然后还提出了一大堆建议。

尝试一下

grep beam.smp /var/log/audit/audit.log | audit2allow -M mypolsemodule -i mypol.pp/sbin/service rabbitmq-server start

PythonでRabbitMQを操作してみる(1)

既然RabbitMQ安装也运行成功了,那么我就来尝尝RabbitMQ的鲜吧。就从官网上的例子一步一笔来做好了。

由于我使用的是Python,那么就需要安装一些支持RabbitMQ的库来进行操作,其中包括

py-amqplib,txAMQP,pika这几种,按照官网的tutorial,我也安装了pika。

pip install pika

从最简单的收发消息开始。即一端发送消息,一端接收消息。

PythonでRabbitMQを操作してみる(1)

发送方即生产者,首先要创建与RabbitMQ服务器的连接,

#!/usr/bin/env pythonimport pikaconnection = 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的独特魅力。

以上就是Python操作RabbitMQ初体验(一)的内容,更多相关内容请关注PHP中文网(www.php.cn)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。