• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
社内勉強会02 シリアライズ[公開用]
 

社内勉強会02 シリアライズ[公開用]

on

  • 990 views

 

Statistics

Views

Total Views
990
Views on SlideShare
783
Embed Views
207

Actions

Likes
0
Downloads
0
Comments
0

2 Embeds 207

http://keme.hatenablog.com 205
https://twitter.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    社内勉強会02 シリアライズ[公開用] 社内勉強会02 シリアライズ[公開用] Presentation Transcript

    • JSONやMessagePackを試した話。2013/4/23 第2回社内エンジニア勉強会けめ公開Ver.
    • シリアライズとはシリアライズ【serialize】(シリアライゼーション)ソフトウェア内部で扱っているデータを丸ごと、ファイルで保存したりネットワークで送受信することができるように変換すること。これとは逆に、ファイルに保存されているシリアライズされたデータや、ネットワークを通じて送られてきたシリアライズされたデータを、ソフトウェアで扱うことのできる元のデータ形式に復元することを「デシリアライズ」(deserialize)「デシリアライゼーション」(deserialization)という。シリアライズとは【serialize】(シリアライゼーション) - 意味/解説/説明/定義 : IT用語辞典http://e-words.jp/w/E382B7E383AAE382A2E383A9E382A4E382BA.html
    • 今日の話• 用途• Web API• キャッシュ• 比較対象• *• *ナイショ:新人の頃から関わってるシステムAと、最近関わったシステムBを事例として紹介
    • 今まで扱ってきたもの
    • システムAナイショ:XMLベースの社内向けAPIの概要とリクエストのサンプルを紹介
    • システムBナイショ:システム間の連携に用いるXML-RPCなAPIの概要とリクエストのサンプルを紹介
    • システムBナイショ:ブラウザ(JS)から呼び出されるJSONベースのAPIの概要とリクエストのサンプルを紹介
    • システムBナイショ:MessagePackでシリアライズして保存したキャッシュデータのサンプルを紹介(文字セットから外れた部分は全て???みたいな状態のまま表示)
    • 小さな容量で表現最小限の型と構造
    • 比較
    • 速度• 変換の速さ• もしXML-RPC準拠ではなくJSONにしていたら・・・• JSON vs MessagePackXML推し流されXML-RPCを採用してみたが・・・
    • 速度benchmarking XMLRPC::Lite vs. RPC::XML for server - tokuhirom’s blog.http://blog.64p.org/entry/20100928/1285630821Benchmark: timing 5000 iterations of RPC::XML, XML::RPC, XML::RPC::Fast, XMLRPC::Lite, restjson...RPC::XML: 2 wallclock secs ( 1.73 usr + 0.00 sys = 1.73 CPU) @ 2890.17/s (n=5000)XML::RPC: 4 wallclock secs ( 4.51 usr + 0.00 sys = 4.51 CPU) @ 1108.65/s (n=5000)XML::RPC::Fast: 2 wallclock secs ( 1.78 usr + 0.00 sys = 1.78 CPU) @ 2808.99/s (n=5000)XMLRPC::Lite: 16 wallclock secs (15.49 usr + 0.01 sys = 15.50 CPU) @ 322.58/s (n=5000)rest json: 0 wallclock secs ( 0.12 usr + 0.00 sys = 0.12 CPU) @ 41666.67/s (n=5000)(warning: too few iterations for a reliable count)Rate XMLRPC::Lite XML::RPC XML::RPC::Fast RPC::XML rest jsonXMLRPC::Lite 323/s -- -71% -89% -89% -99%XML::RPC 1109/s 244% -- -61% -62% -97%XML::RPC::Fast 2809/s 771% 153% -- -3% -93%RPC::XML 2890/s 796% 161% 3% -- -93%rest json 41667/s 12817% 3658% 1383% 1342% --PerlのXML-RPCモジュール比較CPANモジュール選定の参考にさせていただきました!JSON使った方が早い・・・
    • 速度Data::MessagePack - search.cpan.orghttp://search.cpan.org/~tokuhirom/Data-MessagePack/lib/Data/MessagePack.pm-- serializeJSON::XS: 2.3Data::MessagePack: 0.24Storable: 2.21Benchmark: running json, mp, storable for at least 1 CPU seconds...json: 1 wallclock secs ( 1.00 usr + 0.01 sys = 1.01 CPU) @ 141939.60/s(n=143359)mp: 1 wallclock secs ( 1.06 usr + 0.00 sys = 1.06 CPU) @ 355500.94/s(n=376831)storable: 1 wallclock secs ( 1.12 usr + 0.00 sys = 1.12 CPU) @ 38399.11/s (n=43007)Rate storable json mpstorable 38399/s -- -73% -89%json 141940/s 270% -- -60%mp 355501/s 826% 150% --JSON vs MessagePack on PerlMessagePackはさらに早い!
    • 速度Data::MessagePack - search.cpan.orghttp://search.cpan.org/~tokuhirom/Data-MessagePack/lib/Data/MessagePack.pm-- deserializeJSON::XS: 2.3Data::MessagePack: 0.24Storable: 2.21Benchmark: running json, mp, storable for at least 1 CPU seconds...json: 0 wallclock secs ( 1.05 usr + 0.00 sys = 1.05 CPU) @ 179442.86/s(n=188415)mp: 0 wallclock secs ( 1.01 usr + 0.00 sys = 1.01 CPU) @ 212909.90/s(n=215039)storable: 2 wallclock secs ( 1.14 usr + 0.00 sys = 1.14 CPU) @ 114974.56/s(n=131071)Rate storable json mpstorable 114975/s -- -36% -46%json 179443/s 56% -- -16%mp 212910/s 85% 19% --JSON vs MessagePack on Perlデシリアライズも早い!
    • 容量• シリアライズ後の容量• 器と中身• 疑問:データ型はどこまで必要?
    • 容量<struct><member>(省略)</member><member><name>Target</name><value><struct><member><name>Type</name><value><int>1</int></value></member><member><name>Status</name><value><int>7</int></value></member><member><name>Name</name><value><string>hoge256</string></value></member><member><name>Serial</name><value><string>3aefna7eoghaoi3dfna</string></value></member></struct></value></member></struct>ナイショ:実際のリクエストからサンプルに改変データの中身(白)以上に器(赤)の部分が大きい。
    • 容量{"method":"system.admin.getHogeList","params":{"Target":{"Name":"hoge256","Type":1,"Status":7},"Option":{"Info":"Off"}}}(データ型の表現は減ったけど)器はだいぶ小さくなった!ナイショ:実際のリクエストからサンプルに改変
    • 容量JSON vs MessagePack春っぽくお弁当箱をシリアライズしてみる
    • 容量JSON vs MessagePackMessagePackはさらに容量が小さい!
    • 容量• 疑問:データ型はどこまで必要?• 構造やデータ型の取り決め• バリデーション常に決まった構造とデータ型を返すAPIで、その仕様が公開されている場合には恩恵薄い?細かなデータ型もあると「仕様とデータが一緒に届く」とも言えるかも?
    • 可読性• デシリアライズせずに読む• 読み手:人間、プログラム(探索)• 場所:ファイル、データベース• 読み辛さ• データ構造を示す付加情報
    • 可読性• MessagePackを試していて気になったこと• ファイルに書いてcurlでPOST• APIコンソール上で編集• TEXT型のカラムに書けない(MySQL)• ログへの書き出しは?頻繁に使うなら変換ユーティリティとかあると便利手ではJSONを書いて変換する感じにする・・・?JSONからMsgPackに置き換えた際に嵌った。。XMLやJSONはそのまま書き出しているけど・・・
    • まとめ
    • まとめ• 「公開範囲」で選ぶ• 外部公開:RESTful,Ajax, ○○-RPC• 仕様がオープン、公開ライブラリが充実• 社内限定:独自の○○ベースもあり?• プロダクト内部:言語依存もあり?• 例)PerlのStorable
    • まとめ• 「容量」や「速度」で選ぶ• MessagePack ≧ JSON > その他• 「可読性」で選ぶ• JSON ≧ XML >> [超壁] >> MessagePackこの辺りは個人差がありそうw
    • おまけ
    • MessagePack issues121• https://github.com/msgpack/msgpack/issues/121• 「文字列型がほしい」という要望• MessagePackはあくまでデータコンテナで、細かなデータ型の扱いは言語に任せるスタンス• しかしJSON代替としてのニーズも多い• 非互換でもいいからIETF標準にしちまおうぜ!とか言い出して政治的な話にも発展
    • MessagePack issues121• ep3 ゲスト: frsyuki, kiyoto - Tatsuhiko Miyagawas Podcast• http://tmblr.co/ZvMh0tf6XvMn• 開発者の古橋さんがMessagePackを作ったキッカケや、issues121に端を発する議論について、国内外の反応差や言語毎の事情、今後の方針について話しています。• 「MessagePack issues 121」で検索すると、日本語で書かれたまとめ記事なども見つかります。
    • さらにおまけ
    • JSONの整形$ JSONを出力する何か | python -mjson.tool例)標準入力{"method":"system.admin.getHogeList","params":{"":{"User":"hoge256","Type":1,”Status”:7}}}ナイショ:実際のリクエストからサンプルに改変
    • JSONの整形例)標準出力{"method": "system.admin.getHogeList","params": {"Service": {"User": "hoge256","Type": 1,"Status": 7}}}
    • ご清聴ありがとうございました。