Contenu connexe
Similaire à Gumi study7 messagepack
Similaire à Gumi study7 messagepack (20)
Plus de Sadayuki Furuhashi
Plus de Sadayuki Furuhashi (20)
Gumi study7 messagepack
- 7. Tools
Written in Ruby
> automates operation tasks
> easy to implement
> easy to customize
kumoctl
kumostat
kumotop
MessagePack-RPC
Asynchronous RPC library
Cross-language RPC
- 10. MessagePack - 高速シリアライザ
> いつ/どこで MessagePack を使うか
> MessagePack の手法
背景
> シリアライザの設計手法と MessagePack の選択
> フォーマットと Embedded Type Information
> MessagePack の型システムと型変換
MessagePack-RPC - 多機能RPC
> プロトコル
> 並列性 - Parallel Pipelining
> 並列イベント駆動I/O
事例
- 11. MessagePack - 高速シリアライザ
> いつ/どこで MessagePack を使うか
> MessagePack の手法
背景
> シリアライザの設計手法と MessagePack の選択
> フォーマットと Embedded Type Information
> MessagePack の型システムと型変換
MessagePack-RPC - 多機能RPC
> プロトコル
> 並列性 - Parallel Pipelining
> 並列イベント駆動I/O
事例
- 12. 背景
• 多言語でシステムを構築したい
> C++で分散KVSを実装 + Rubyで管理を自動化
> Rubyでプロトタイプ → 段階的にC++に移植
> Javaサーバ + Rubyクライアント
• スケールアウト時代に耐える通信システムが欲しい
> 多数のサーバやクライアントが並列して通信
> マルチコア環境でもスケールする並列性
- 23. MessagePack - 高速シリアライザ
> いつ/どこで MessagePack を使うか
> MessagePack の手法
背景
> シリアライザの設計手法と MessagePack の選択
> フォーマットと Embedded Type Information
> MessagePack の型システムと型変換
MessagePack-RPC - 多機能RPC
> プロトコルと Parallel Pipelining
> 並列イベント駆動I/O
> FutureとSessionによる隠蔽
事例
- 24. MessagePack - 高速シリアライザ
> いつ/どこで MessagePack を使うか
> MessagePack の手法
背景
> シリアライザの設計手法と MessagePack の選択
> フォーマットと Embedded Type Information
> MessagePack の型システムと型変換
MessagePack-RPC - 多機能RPC
> プロトコルと Parallel Pipelining
> 並列イベント駆動I/O
> FutureとSessionによる隠蔽
事例
- 26. require 'msgpack' # gem install “msgpack"
raw = [1,2,3].to_msgpack #=> "x93x01x02x03"
MessagePack.unpack(raw) #=> [1,2,3]
public class Main {
public static void main(String[] args) {
byte[] raw = MessagePack.pack(new MyClass());
MyClass dst = MessagePack.unpack(raw, MyClass.class);
}
}
int main() {
msgpack::sbuffer raw; std::vector<int> src; std::vector<int> dst;
msgpack::pack(raw, src);
msgpack::unpack(raw.data(), raw.size())->convert(&dst);
}
Ruby
Java
C++
- 33. Type information
Positive FixNum
Negative FixNum
FixMap
FixArray
FixRaw
0x00
0xc0
0x80
0x90
0xa0
0xe0
0x00
0xc2
0xc3
0xca
0xcb
0xcc
0xcd
0xce
0xcf
0xdf
...
nil
false
true
float
double
uint8
uint16
uint32
uint64
int8
...
Type information Types
- 36. MessagePackの型
• MessagePackの型 を導入
> JSON互換
整数, 浮動小数点数, Boolean, nil,
文字列, 配列, 連想配列
> MessagePackの型 を表現するクラスを導入
Java:MessagePackObject
C++:msgpack::object
> MessagePackの型 と 言語の型 を
相互に変換する機能をライブラリで実装
- 38. 高度な型変換
• テンプレート(Java版, C++版)
> デシリアライズされたオブジェクトの型を検査
> 型の変換や型チェックするコードが不要になる
• Optionalフィールド(Java版)
> クラスのデシリアライズ時に、値の省略を許し
て、デフォルト値を使う
• 高速化
> コンパイル時コード生成(C++版)
> 実行時コード生成(Java版)
- 41. msgpack json protobuf avro thrift
形式
型情報
スキーマ記述
ストリーミング
RPC
シリアライザ
単体で利用
binary text binary binary binary
埋め込み 埋め込み 外部
外部
(添付) 外部
コード内に記述
Thrift互換形式の
IDLも実装中
JSON
Schema?
必須
(独自DSL)
必須
(JSON形式)
必須
(独自DSL)
対応 できるはず 非対応 非対応 非対応
msgpack-rpc json-rpc (非公開) avro thrift
可能 可能 可能 可能 面倒
- 42. MessagePack - 高速シリアライザ
> いつ/どこで MessagePack を使うか
> MessagePack の手法
背景
> シリアライザの設計手法と MessagePack の選択
> フォーマットと Embedded Type Information
> MessagePack の型システムと型変換
MessagePack-RPC - 多機能RPC
> プロトコルと Parallel Pipelining
> 並列イベント駆動I/O
> FutureとSessionによる隠蔽
事例
- 43. MessagePack - 高速シリアライザ
> いつ/どこで MessagePack を使うか
> MessagePack の手法
背景
> シリアライザの設計手法と MessagePack の選択
> フォーマットと Embedded Type Information
> MessagePack の型システムと型変換
MessagePack-RPC - 多機能RPC
> プロトコルと Parallel Pipelining
> 並列イベント駆動I/O
> FutureとSessionによる隠蔽
事例
- 49. 並列性
• RPCの要求と応答に メッセージID を入れ、クラ
イアント側で要求と応答を対応付ける
> サーバで処理する順番は自由
> サーバの並列化が容易
全要求を自動的に並列化する(Java, C++版)
> 重いタスクが軽いタスクを待たせない
- 50. MessagePack - 高速シリアライザ
> いつ/どこで MessagePack を使うか
> MessagePack の手法
背景
> シリアライザの設計手法と MessagePack の選択
> フォーマットと Embedded Type Information
> MessagePack の型システムと型変換
MessagePack-RPC - 多機能RPC
> プロトコルと Parallel Pipelining
> 並列イベント駆動I/O
> FutureとSessionによる隠蔽
事例
- 56. shared
event looptimer, signal handler,
other protocol, etc...
Dispatcher
イベント駆動I/O
Client
Server
Loop
Session
クライアントサイド イベント駆動I/O
Client
サーバとクライアントを同じ
イベントループ上で動作
- 59. MessagePack - 高速シリアライザ
> いつ/どこで MessagePack を使うか
> MessagePack の手法
背景
> シリアライザの設計手法と MessagePack の選択
> フォーマットと Embedded Type Information
> MessagePack の型システムと型変換
MessagePack-RPC - 多機能RPC
> プロトコルと Parallel Pipelining
> 並列イベント駆動I/O
> FutureとSessionによる隠蔽
事例
- 61. Future
非同期処理を抽象化
require 'msgpack/rpc'
loop = MessagePack::RPC::Loop.new
c1 = MessagePack::RPC::Client.new(host, port, loop)
c2 = MessagePack::RPC::Client.new(host, port, loop)
future1 = c1.call_async(:method1, arg)
future2 = c2.call_async(:method2, arg)
future2.get
future1.get
- 66. Future
非同期処理を抽象化
require 'msgpack/rpc'
loop = MessagePack::RPC::Loop.new
c1 = MessagePack::RPC::Client.new(host, port, loop)
c2 = MessagePack::RPC::Client.new(host, port, loop)
future1 = c1.call_async(:method1, arg)
future2 = c2.call_async(:method2, arg)
future2.get
future1.get
- 68. MessagePack - 高速シリアライザ
> いつ/どこで MessagePack を使うか
> MessagePack の手法
背景
> シリアライザの設計手法と MessagePack の選択
> フォーマットと Embedded Type Information
> MessagePack の型システムと型変換
MessagePack-RPC - 多機能RPC
> プロトコルと Parallel Pipelining
> 並列イベント駆動I/O
> FutureとSessionによる隠蔽
事例
- 69. MessagePack - 高速シリアライザ
> いつ/どこで MessagePack を使うか
> MessagePack の手法
背景
> シリアライザの設計手法と MessagePack の選択
> フォーマットと Embedded Type Information
> MessagePack の型システムと型変換
MessagePack-RPC - 多機能RPC
> プロトコルと Parallel Pipelining
> 並列イベント駆動I/O
> FutureとSessionによる隠蔽
事例
- 70. 事例
• Sedue Search Cloud
• Amebaなう
• kumofs
• Sekai Camera
• mycached
• Ficia
> kumofs での Data::Model の使い方 http://blog.yappo.jp/yappo/archives/000710.html
• Cassandra?
- 75. MessagePack - 高速シリアライザ
> いつ/どこで MessagePack を使うか
> MessagePack の手法
背景
> シリアライザの設計手法と MessagePack の選択
> フォーマットと Embedded Type Information
> MessagePack の型システムと型変換
MessagePack-RPC - 多機能RPC
> プロトコルと Parallel Pipelining
> 並列イベント駆動I/O
> FutureとSessionによる隠蔽
事例
- 76. MessagePack - 高速シリアライザ
> いつ/どこで MessagePack を使うか
> MessagePack の手法
背景
> シリアライザの設計手法と MessagePack の選択
> フォーマットと Embedded Type Information
> MessagePack の型システムと型変換
MessagePack-RPC - 多機能RPC
> プロトコルと Parallel Pipelining
> 並列イベント駆動I/O
> FutureとSessionによる隠蔽
事例
- 77. まとめ - MessagePack
• 高速なシリアライズ形式
> バイナリ形式のコンパクトなフォーマット
JSONと比べて約20%くらいデータサイズを削減
> 中間型システム + 型変換API により多言語に対応
> 型情報をデータに埋め込む; 定義ファイルが不要
> JSONと相互に変換可能
> ストリーミング機能
- 78. まとめ - MessagePack-RPC
• 多機能なRPCシステム
> クライアントサイドイベント駆動I/O;
複数のコネクションで通信を並列化
> Parallel Pipelining;
1本のコネクション上でも通信を並列化
> Futureにより複雑な並列イベント駆動I/Oを隠蔽
> Sessionによりコネクションを隠蔽
コネクションの確立・維持・再接続を自動化
- 79. まとめ - The MessagePack Project
• 世界で利用拡大中
• コミッタ募集中
• 利用事例募集中
- 80. MessagePack
• C++
> Sadayuki Furuhashi
• Ruby
> Sadayuki Furuhashi
• Java
> Muga Nishizawa
• Python
> INADA Naoki
• Haskell
> Hideyuki Tanaka
• Lua
> Nobuyuki Kubota
• Perl
> tokuhirom, gfx, ...
• Erlang
> UENISHI Kota
• Node.JS
> Peter Griess
• JavaScript
> uupaa
• PHP
> advect
• D
> repeatedly
対応言語と開発者の一部
- 81. MessagePack-RPC
• C++版 - Sadayuki Furuhashi
• Erlang版 - UENISHI Kota
• Haskell版 - Hideyuki Tanaka
• Java版 - Muga Nishizawa
• PHP版 - h0x10
• Python版 - INADA Naoki
• Ruby版 - Sadayuki Furuhashi
対応言語と開発者の一部