Symfoware

Symfowareについての考察blog

RabbitMQにMessagePackのデータをキューとして登録する

ふと、RabbitMQのキューデータに文字列じゃなくてJSON文字列を登録したら
いろんな情報を詰め込めるのでは?と思いました。

せっかくなので、JSONではなくてMessagePackで変換したデータを登録してみます。
http://msgpack.org/

PHP側でデータを登録。
Python側でデータを取得してデコード。

・・・というパターンを試してみます。



PHPのMessegePack



PHPでMessagePackが使えるようにしておきます。
以前やったこちらを参考に。
FreeBSD10 + PHP5でMessagePackを使用して、Mapのシリアライズと復元

今回は、Debian 7 + Apache 2です。
pecl、phpizeが使えるようにしておきます。


# apt-get install php5-dev
# apt-get install php-pear




peclコマンドでmsgpackをインストール


# pecl install msgpack

(略)
Build process completed successfully
Installing '/usr/include/php5/ext/msgpack/php_msgpack.h'
Installing '/usr/lib/php5/20100525/msgpack.so'
install ok: channel://pecl.php.net/msgpack-0.5.4
configuration option "php_ini" is not set to php.ini location
You should add "extension=msgpack.so" to php.ini




ライブラリのロードは自動的に追加されない模様。
ライブラリのロードを指定するファイルを作成します。


# vi /etc/php5/apache2/conf.d/10-msgpack.ini



内容は以下の一行。


extension=msgpack.so




apacheの設定読みなおし。


# /etc/init.d/apache2 reload



phpinfoを表示して、msgpackが表示されればインストール成功です。

471_01.png




PHPの送信サンプル



適当にデータを登録してみます。
データは以下の内容にしました。


blog:Symfoware(string)
url:http://symfoware.blog68.fc2.com/(string)
comment:Symfowareについての考察blog(string)
active:true(bool)
count:1490(int)



プログラムはこのようになります。

・send.php


  1. <?php
  2. require_once __DIR__ . '/vendor/autoload.php';
  3. use PhpAmqpLib\Connection\AMQPConnection;
  4. use PhpAmqpLib\Message\AMQPMessage;
  5. # RabbitMQに接続
  6. $connection = new AMQPConnection('192.168.1.12', 5672, 'symfo', 'P@ssw0rd');
  7. $channel = $connection->channel();
  8. # キューに永続化モードで接続
  9. $channel->queue_declare('msgpack', false, true, false, false);
  10. $properties = array('content_type' => 'text/plain', 'delivery_mode' => 2);
  11. # 登録用のデータを用意
  12. $data = array(
  13.             'blog' => 'Symfoware',
  14.             'url' => 'http://symfoware.blog68.fc2.com/',
  15.             'comment' => 'Symfowareについての考察blog',
  16.             'active' => true,
  17.             'count' => 1490
  18.         );
  19. # シリアライズ実行
  20. $binary = msgpack_serialize($data);
  21. # データ登録実行
  22. $msg = new AMQPMessage($binary, $properties);
  23. $channel->basic_publish($msg, '', 'msgpack');
  24. echo " [x] Sent blog data<br>";
  25. $channel->close();
  26. $connection->close();




プラウザで対象のプログラムを実行します。

471_02.png


ちゃんとキューに登録されました。

471_03.png







PythonのMessagePack



こちらの手順を参考にします。
PythonでMessagePackを使用して、Mapのシリアライズと復元

easy_installでライブラリをインストール。
なお、クライアントはUbuntu 14.04です。


$ sudo easy_install msgpack-python







Pythonの受信側



受信側のサンプルはこんな感じになりました。

・recv.py


  1. # -*- coding:utf-8 -*-
  2. import pika
  3. import msgpack
  4. # ユーザー名とパスワード
  5. credentials= pika.PlainCredentials('symfo', 'P@ssw0rd')
  6. # 接続パラメーター作成
  7. connect_param = pika.ConnectionParameters(
  8.                     host='192.168.1.12',
  9.                     credentials=credentials)
  10. # コネクション作成
  11. connection = pika.BlockingConnection(connect_param)
  12. channel = connection.channel()
  13. # helloキューに接続
  14. channel.queue_declare(queue='msgpack',durable=True)
  15. print ' [*] Waiting for messages. To exit press CTRL+C'
  16. # コールバックメソッドを指定
  17. def callback(ch, method, properties, body):
  18.     ret = msgpack.unpackb(body, encoding='utf-8')
  19.     print ret['blog']
  20.     print ret['url']
  21.     print ret['comment']
  22.     print ret['active']
  23.     print ret['count']
  24. # コールバックを登録して待ち受け
  25. channel.basic_consume(callback,
  26.                      queue='msgpack',
  27.                      no_ack=True)
  28. channel.start_consuming()




実行してみると・・・


$ python recv.py
[*] Waiting for messages. To exit press CTRL+C
Symfoware
http://symfoware.blog68.fc2.com/
Symfowareについての考察blog
True
1490




そうなるように作っているのですが、ちゃんと辞書型のオブジェクトとして
キューの内容が取得出来ました。

いい感じです。




【参考URL】

http://msgpack.org/
https://pve.proxmox.com/wiki/Install_PECL_Extensions_in_OpenVZ_Debian_Appliances
http://pear.php.net/manual/ja/guide.users.commandline.installing.php
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/09/07(日) 18:21:04|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<RabbitMQに画像データをキューとして登録する | ホーム | RabbitMQにPHPクライアント(php-amqplib)からメッセージを送信、受信する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1491-e94a2575
この記事にトラックバックする(FC2ブログユーザー)