messagepack rakuten technology conference 2010

73
古橋貞之 e MessagePack Project 高速メッセージングシステム #msgpack @frsyuki http://d.hatena.ne.jp/viver/

Upload: sadayuki-furuhashi

Post on 09-May-2015

7.153 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: MessagePack Rakuten Technology Conference 2010

古橋貞之

!eMessagePackProject高速メッセージングシステム

#msgpack @frsyukihttp://d.hatena.ne.jp/viver/

Page 2: MessagePack Rakuten Technology Conference 2010
Page 3: MessagePack Rakuten Technology Conference 2010
Page 4: MessagePack Rakuten Technology Conference 2010

Application

ServerManager

Gateway

Manager

冗長構成

Server

Server

Server

Server

Server

Application

GatewayApplication

Gateway

レプリケーション

Tokyo Cabinet

Page 5: MessagePack Rakuten Technology Conference 2010
Page 6: MessagePack Rakuten Technology Conference 2010
Page 7: MessagePack Rakuten Technology Conference 2010

MessagePack?

{“msgpack”:“json”, “hello”:“world”}

24%削減

MessagePack26 bytes

JSON34 bytes

“It's like JSON, but very fast and small.”

Page 8: MessagePack Rakuten Technology Conference 2010

“It's like JSON, but very fast and small.”MessagePack?

MessagePack for C++

Page 9: MessagePack Rakuten Technology Conference 2010

MessagePack for Java (開発中)

Page 10: MessagePack Rakuten Technology Conference 2010

MessagePack-RPC?

Rails app

C++ serverJava app

MessagePack-RPC

“Cross-language messaging library”

Page 11: MessagePack Rakuten Technology Conference 2010

MessagePack

・高速シリアライズシステム・Externalizable, JSON, Protocol Buffers

MessagePack-RPC・多機能メッセージングシステム・SOAP, XML-RPC, Thrift

Page 12: MessagePack Rakuten Technology Conference 2010

MessagePackプロジェクトの成り立ち

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

> プロトコル> 並列性 - Parallel Pipelining> イベント駆動フレームワーク> Futureとセッション> 多言語対応

MessagePack> 多言語対応

MessagePackの未来

Page 13: MessagePack Rakuten Technology Conference 2010

MessagePackプロジェクトの成り立ち

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

> プロトコル> 並列性 - Parallel Pipelining> イベント駆動フレームワーク> Futureとセッション> 多言語対応

MessagePack> 多言語対応

MessagePackの未来

Page 14: MessagePack Rakuten Technology Conference 2010

MessagePackプロジェクト

• 何度もプロトコルを実装するのは大変> V-FIELD, Cagra, Kastor, kumofs, ...> 汎用的で高機能なRPCシステムが欲しい

• 全部C++で書きたくない> 後から拡張するのが大変> 管理ツールはRubyで自動化したい> 多言語で通信できるRPCシステムが欲しい

Page 15: MessagePack Rakuten Technology Conference 2010

MessagePackプロジェクト

• kumofsに汎用的なバイナリプロトコルを実装> MessagePack C++版/Ruby版

• kumofsのRPC機能全体を切り出して汎用化> MessagePack-RPC C++版/Ruby版

• オープンソース化

Page 16: MessagePack Rakuten Technology Conference 2010

MessagePackプロジェクト

• 分散システムの実装が非常に簡単になる> MessagePack-RPC + Ruby> 54行で分散Key-Value store レプリケーション機能付き> 140行で分散検索エンジン twitterのリアルタイム検索

Page 17: MessagePack Rakuten Technology Conference 2010

MessagePackの特徴

• 大きなデータを扱うシステムにも対応できる設計> 実装しやすいフォーマット> 高速なシリアライズ・デシリアライズ> コンパクトなデータサイズ

• 多言語対応> JSONと互換性のある型システム

• 後方互換性(動的型付け)> 互換性を保ったままプロトコルを更新

Page 18: MessagePack Rakuten Technology Conference 2010

MessagePack-RPCの特徴

• 複雑な分散システムをシンプルに実装できる設計> 実装しやすいシンプルなプロトコル> マルチスレッド環境を想定した高い並列性> 複数サーバ環境を想定したアーキテクチャ> 多言語対応

• 堅牢な実装> コネクションプーリング> タイムアウト

Page 19: MessagePack Rakuten Technology Conference 2010

MessagePackプロジェクトの成り立ち

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

> プロトコル> 並列性 - Parallel Pipelining> イベント駆動フレームワーク> Futureとセッション> 多言語対応

MessagePack> 多言語対応

MessagePackの未来

Page 20: MessagePack Rakuten Technology Conference 2010

プロトコルシンプルなプロトコル

[0, msgid, method, params]

[1, msgid, error, result]

[2, method, params]

Request

Response

Notify

メッセージID→Parallel Pipelining

Page 21: MessagePack Rakuten Technology Conference 2010

並列性

クライアント サーバ パイプライン化応答が帰ってくる前に立て続けに複数の要求を発行することで高速化を図る

実装例:・HTTP/1.1 pipelining・Thrift・SOAP

Page 22: MessagePack Rakuten Technology Conference 2010

クライアント サーバ

並列性

重いタスク軽いタスク

実装例:・HTTP/1.1 pipelining・Thrift・SOAP

重いタスクが軽いタスクを待たせる > 並列性が低下

順番を揃える(キュー)

Page 23: MessagePack Rakuten Technology Conference 2010

クライアント サーバ

並列性

実装例:・MessagePack-RPC

応答の順番を揃える必要が無い早く終わったタスクはすぐに返す > 並列性が向上 > サーバのリソース消費量を削減

時間短縮

重いタスク軽いタスク

Page 24: MessagePack Rakuten Technology Conference 2010

並列性ベンチマークテスト

Page 25: MessagePack Rakuten Technology Conference 2010

プロトコル

• 実装しやすいシンプルなプロトコル• 並列処理しやすいプロトコル> メッセージにIDを入れる 実際に処理される順番は問わない 任意の順番で非同期処理できる

• サーバの負荷を軽減する> RequestとResponseの対応付けはクライアント側で行う

Page 26: MessagePack Rakuten Technology Conference 2010

MessagePackプロジェクトの成り立ち

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

> プロトコル> 並列性 - Parallel Pipelining> イベント駆動フレームワーク> Futureとセッション> 多言語対応

MessagePack> 多言語対応

MessagePackの未来

Page 27: MessagePack Rakuten Technology Conference 2010

イベント駆動I/Oサーバーサイド イベント駆動I/O

Dispatcher

ServerClient

Client

Loop

multi-threaded event-driven I/O(C++, Java)

大量のクライアントと効率的に通信できる

Page 28: MessagePack Rakuten Technology Conference 2010

イベント駆動I/OClient

Session Loop Server

Client

ServerSession Loop

クライアントサイド イベント駆動I/O

Page 29: MessagePack Rakuten Technology Conference 2010

イベント駆動I/O

sharedevent loop

Client

Client

Server

Server

Loop

Session

Session

クライアントサイド イベント駆動I/O

並列して通信可能

Page 30: MessagePack Rakuten Technology Conference 2010

イベント駆動I/O

Session PoolServer

Server

pools these connectionsLoop

Session

Session

connection

クライアントサイド イベント駆動I/O

Page 31: MessagePack Rakuten Technology Conference 2010

Dispatcher

イベント駆動I/O

sharedevent loop

Client

Server

Server

Loop

Session

Session

クライアントサイド イベント駆動I/O

Client

サーバとクライアントを同じイベントループ上で動作

Page 32: MessagePack Rakuten Technology Conference 2010

sharedevent looptimer, signal handler,

other protocol, etc...

Dispatcher

イベント駆動I/OClient

Server

Loop

Session

クライアントサイド イベント駆動I/O

Client

サーバとクライアントを同じイベントループ上で動作

Page 33: MessagePack Rakuten Technology Conference 2010

アーキテクチャ

• イベント駆動型のI/Oアーキテクチャ> スレッドを使わずに並列化できる 多数のクライアントと効率よく通信できる> クライアント側もイベント駆動 多数のサーバと効率よく通信できる> 例:多数のサーバ同士が通信しあう分散システム> 例:クラスタの一括制御ツール

Page 34: MessagePack Rakuten Technology Conference 2010

アーキテクチャ

• コネクションをプーリング> 何度もコネクションを張り直す負荷を削減> 高負荷時でもポート番号が足りなくならない

• 1つのイベントループに様々なイベントハンドラを追加のせてプログラムを構築できる> 「並列RPCフレームワーク」> サーバ/クライアント両方の特性を持つシステム 例:プロキシサーバ

Page 35: MessagePack Rakuten Technology Conference 2010

MessagePackプロジェクトの成り立ち

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

> プロトコル> 並列性 - Parallel Pipelining> イベント駆動フレームワーク> Futureとセッション> 多言語対応

MessagePack> 多言語対応

MessagePackの未来

Page 36: MessagePack Rakuten Technology Conference 2010

Futureとセッション

• Future> 「未来の結果」を表すオブジェクト 実際に参照されるまで結果の処理を遅延させる> 非同期呼び出しを抽象化> イベント駆動I/Oを隠蔽

• セッション> 「コネクション」の概念を隠蔽> 接続・再接続・接続維持を自動化

Page 37: MessagePack Rakuten Technology Conference 2010

Future

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.getfuture1.get

Page 38: MessagePack Rakuten Technology Conference 2010

Futureクライアント サーバ1 サーバ2

call_async(method1)

call_async(method2)

future1

future2

Page 39: MessagePack Rakuten Technology Conference 2010

セッションコネクションの隠蔽

sharedevent loop

Server

Server

Loop

Session

Session

connection

Page 40: MessagePack Rakuten Technology Conference 2010

セッションコネクションの隠蔽

sharedevent loop

Server

Server

Loop

Session

Session

connection

Future

Future

Future

Future

コネクションを隠蔽非同期処理を抽象化

Page 41: MessagePack Rakuten Technology Conference 2010

セッションコネクションの隠蔽

Session

Session

Future

Future

Future

Future

コネクションを隠蔽非同期処理を抽象化

セッション:コネクションを直接制御させない > 接続が切れたら自動的に再接続 > コネクションプーリング

Future:非同期処理を直接記述させない > 記述を簡略化 > バックグラウンドで処理できる 通信は自動的に並列処理

Page 42: MessagePack Rakuten Technology Conference 2010

Future

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.getfuture1.get

Page 43: MessagePack Rakuten Technology Conference 2010
Page 44: MessagePack Rakuten Technology Conference 2010

MessagePackプロジェクトの成り立ち

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

> プロトコル> 並列性 - Parallel Pipelining> イベント駆動フレームワーク> Futureとセッション> 多言語対応

MessagePack> 多言語対応

MessagePackの未来

Page 45: MessagePack Rakuten Technology Conference 2010

“you're writing so!ware that only has to run on your own servers, you can use any language you want.”

Beating the AveragesPaul Graham

Page 46: MessagePack Rakuten Technology Conference 2010

多言語対応

• 現実> 既存のシステムに制約される> オーバーヘッドが大きく実装も大変な連携手段 HTTP, XML, ...

• 理想> 用途に適した言語を選択 Ruby, Java, Scala, Haskell, Erlang, ...> 他のモジュールやプロジェクトとスムーズに連携

Page 47: MessagePack Rakuten Technology Conference 2010

多言語対応

• 理想> 用途に適した言語を選択 Ruby, Java, Scala, Haskell, Erlang, ...> 他のモジュールやプロジェクトとスムーズに連携

MessagePack-RPC

Page 48: MessagePack Rakuten Technology Conference 2010

制約とロックイン 選択と連携

MessagePack-RPC

Page 49: MessagePack Rakuten Technology Conference 2010

Rubyフロントエンド

Java既存資産

Page 50: MessagePack Rakuten Technology Conference 2010

Rubyフロントエンド

Python別プロジェクト

Java既存資産

C++計算サーバ

Haskellツール

Page 51: MessagePack Rakuten Technology Conference 2010

多言語対応

• C++版 - Sadayuki Furuhashi• Erlang版 - UENISHI Kota• Haskell版 - Hideyuki Tanaka• Java版 - Muga Nishizawa• PHP版 - h0x10• Python版 - INADA Naoki• Ruby版 - Sadayuki Furuhashi

対応言語と開発者の一部

Page 52: MessagePack Rakuten Technology Conference 2010

多言語対応の問題

• 言語間の差異を吸収する層が必要> 型システムの違い 文字列とバイト列の区別がない 配列と連想配列の区別がない クラスがない> クラス名や変数名の命名規則が違う

• MessagePack

Page 53: MessagePack Rakuten Technology Conference 2010

MessagePackプロジェクトの成り立ち

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

> プロトコル> 並列性 - Parallel Pipelining> イベント駆動フレームワーク> Futureとセッション> 多言語対応

MessagePack> 多言語対応

MessagePackの未来

Page 54: MessagePack Rakuten Technology Conference 2010

シリアライザ

• シリアライザの役割> オブジェクトをバイト列に変換> バイト列からオブジェクトを復元

• シリアライザの用途> オブジェクトをDBやキャッシュに保存> オブジェクトをネットワーク越しに転送

Page 55: MessagePack Rakuten Technology Conference 2010

シリアライザ

• シリアライザの特性> バイナリかテキストか 人間が読める <-> 人間には読めない> シリアライズ後のデータに型情報を埋め込むか データサイズが大きくなる <-> 小さく済む データ本体だけでデシリアライズ可能 <-> データとは別に型定義ファイルが必要

> 多言語に対応しているか

Page 56: MessagePack Rakuten Technology Conference 2010

MessagePack

• バイナリ形式のシリアライズフォーマット• JSONと互換性のある型システム> 整数, 真偽値, 配列, 連想配列, ...

• 型情報をシリアライズ後のデータに埋め込む> コンパクトに埋め込むエンコーディング手法

• シリアライズ後のデータが非常に小さい• シリアライズ・デシリアライズが高速

Page 57: MessagePack Rakuten Technology Conference 2010

多言語対応の問題

• 言語間の差異を吸収する必要がある> 型システムの違い 文字列とバイト列の区別がない 配列と連想配列の区別がない クラスがない> クラス名や変数名の命名規則が違う

Page 58: MessagePack Rakuten Technology Conference 2010

多言語対応

• 各言語間で擦り合わせると、組み合わせが爆発• 「MessagePackの型システム」に変換する> JSON互換> 整数, 浮動小数点数, Boolean, Nil, 文字列,配列, 連想配列

Page 59: MessagePack Rakuten Technology Conference 2010

MessagePackC++の型 Rubyの型

MessagePackの型

Javaの型

msgpack::object

MessagePackObject

多言語対応

Page 60: MessagePack Rakuten Technology Conference 2010

MessagePack

MessagePackの型

多言語対応

JSONの型

Page 61: MessagePack Rakuten Technology Conference 2010

多言語対応

• 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

対応言語と開発者の例

Page 62: MessagePack Rakuten Technology Conference 2010

まとめ

• MessagePack-RPC> RPCシステム シンプルなプロトコル 高い並列性 多機能 多言語対応> 「選択と連携」

• MessagePack> シリアライズシステム 高速 コンパクト 埋め込まれた型情報 多言語対応

> 「柔軟の永続化」

Page 63: MessagePack Rakuten Technology Conference 2010

MessagePackプロジェクトの成り立ち

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

> プロトコル> 並列性 - Parallel Pipelining> イベント駆動フレームワーク> Futureとセッション> 多言語対応

MessagePack> 多言語対応

MessagePackの未来

Page 64: MessagePack Rakuten Technology Conference 2010

MessagePackの未来

• 実装と移植• テスト• ドキュメント• 宣伝• 実績と洗練• 事実上の標準…

Page 65: MessagePack Rakuten Technology Conference 2010

分散キャッシュ分散データベース

MessagePack Platform

分散メッセージキュー分散メディアストレージ

分散システムミドルウェア

Page 66: MessagePack Rakuten Technology Conference 2010

スケーラブルなシステムの安定した量産を可能にする。

様々な分散システムをMessagePackを使って結合し、

スケーラブルな分散型のミドルウェアを実現。

MessagePack Platform

Page 67: MessagePack Rakuten Technology Conference 2010

Powered by

Sedue

Amebaなう Sekai Camera頓智ドット

PFI

Cyber Agent

CarrotAsk Solem

Ficiaえとらぼ

ROMA-MessagePack

楽天技術研究所Cassandra-MessagePack

Page 68: MessagePack Rakuten Technology Conference 2010
Page 69: MessagePack Rakuten Technology Conference 2010

http://sedue.sc/Sedue Cloud Search: 簡単に使える高性能検索エンジン・レコメンドエンジンクラウドサービス

Page 70: MessagePack Rakuten Technology Conference 2010

http://sedue.sc/Sedue Cloud Search: 簡単に使える高性能検索エンジン・レコメンドエンジンクラウドサービス

Page 71: MessagePack Rakuten Technology Conference 2010

MessagePackと”グローバル”

• 「オープンソースに国境はない」> MessagePack Node.JS版> MessagePack-RPC Node.JS版 Peter Griess> MessagePack PHP版 advect> Carrot: Python AMQP Framework Ask Solem Hoel

Page 72: MessagePack Rakuten Technology Conference 2010

MessagePack が「魅力」的であるために

「学生」「余暇の時間に」→ 瞬発力・斬新さ

「システム開発に」「製品に」→ 持続力・堅牢さ

MessagePack が「有用」であるために

オープンソースの原動力

Page 73: MessagePack Rakuten Technology Conference 2010

開発者にエールを

http://msgpack.org/ http://github.com/msgpack

Twitter: #msgpack msgpack@googlegroups