Raspberry Pi と他のサーバーとの連携を考える
Raspberry Pi で、少しずつ遊んでいるところだが、パソリで IDm をとることに成功したので、カードを読み込ませたら、IDm をリモートのサーバーに登録するのをやってみることにした。まあ、いろいろとやりようはあるだろうが、RPC を使ってやってみることにした。最初は、標準の XMLRPC を使ってみたが、もっとパフォーマンスのよいモジュールがないかちょっと調べてみる。Index of Packages Matching 'rpc'を見てみると、けっこういろいろある。Django や Flask、Zope、CherryPy、あるいは、Twisted や Tornado などの Web フレームワークの延長線上で作られたようなものや、ØMQ(ZeroMQ)、AMQP、RabbitMQ のようなメッセージキュー系のものなどもふくめてたくさんあり、どれを使えばよいものかという感じ。やりとりの方法も、XML-RPC も、JSON-RPC もいろいろある。速くて軽くて安定してりゃいいでしょって基準で探してみる?MessagePackを使ったものがあった。MessagePack は JSON ぽいところがあるけれど、もっと高速でコンパクトにシリアライズして送受信できるものらしい。Protocol Buffers よりも速いらしい。例えば、[1,2,3] ならば、>>>import msgpack>>> msgpack.packb([1, 2, 3])'\x93\x01\x02\x03'>>> msgpack.unpackb(_)[1, 2, 3]MessagePack for PythonPython で実装した Official な MessagePack for Python - msgpack-python (Masahiro Nakagawa)もあるけれど、mprpc - A fast MessagePack RPC library (Studio Ousia) を使ってみた。mprc は geventとMesssagePack をベースにしていて、Official なものの 1.8倍程度の速度が出るようだ。まぁ、それほど高速とかこだわってないんだけど何にも考えずに速くなるならいいやw。mprpc を見てみると Cython使ってんじゃん。なるほどそういうことか。まあ、とにかく軽くて速けりゃ、Raspberry Pi で使うにはよいかなと(まだ Raspberry Pi では動かしてない)。ちょこっとだけソース見ると、msgpack-python の方は、下の方で tornado 使ってる。mprpc は gevent 使ってる。でもって、gsocketpool を使った実装ではさらに早くなるみたい。ちなみに、msgpack-python も、mprpc も日本の方が書かれているようだ。MessagePack も日本人の方々のようだ。ちょっと調べてみる。バイナリシリアライズ形式「MessagePack」(Sadayuki Furuhashi) のあたりも見る。そうかそうか。fluentd の人か。流行に疎い私も fluentd は名前だけは目にしていた。なんかソフトウェアの世界でも特にこの10年で日本発で世界に認められるというパターンが増えてきている印象。若くてピチピチしていた才能溢れる人たちがちゃんと育っているのね。いいことだ。ついでなのでいろいろ見ておく。MessagePack Wikiバイナリシリアライズ形式「MessagePack」Introducing the MessagePackMessagePack-RPCのプロトコル仕様(ドラフト)と実装例高速メッセージングシステムMessagePack - 楽天テクノロジーカンファレンス2010筑波大学大学院博士課程 システム情報工学研究科修士論文 分散システムのためのメッセージ表現手法に関する研究グリー技術者が聞いた、fluentdの新機能とTreasure Data古橋氏の野心 (1/3)#22 古橋貞之氏 世の中を幸せにするシステムを開発したい前置きはさておき、コード的にはこういうものになる。いずれも、Package Index: mprpc 0.1.2よりからの引用。インストール$ pip install Cython$ pip install mprpcサーバー側from gevent.server import StreamServerfrom mprpc import RPCServerclass SumServer(RPCServer): def sum(self, x, y): return x + yserver = StreamServer(('127.0.0.1', 6000), SumServer)server.serve_forever()クライアント側from mprpc import RPCClientclient = RPCClient('127.0.0.1', 6000)print client.call('sum', 1, 2)gsocketpool を使うと、import gsocketpool.poolfrom mprpc import RPCPoolClientclient_pool = gsocketpool.pool.Pool(RPCPoolClient, dict(host='127.0.0.1', port=6000))with client_pool.connection() as client: print client.call('sum', 1, 2)理屈は抜きに、簡単に使えるから嬉しいじゃないの。過去の関連記事Raspberry Pi 買ってみたRaspberry Pi で LED チカチカしてみたRaspberry Pi と Sony RC-S380/P、nfcpy で NFC カードの IDm を読み取る★確実正規★返金保証★サポート抜群【最安挑戦】【即納】ラズベリーパイ Raspberry Pi Type B 512MB【確実正規】