messagepack rakuten technology conference 2010

Post on 09-May-2015

7.153 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

古橋貞之

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

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

Application

ServerManager

Gateway

Manager

冗長構成

Server

Server

Server

Server

Server

Application

GatewayApplication

Gateway

レプリケーション

Tokyo Cabinet

MessagePack?

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

24%削減

MessagePack26 bytes

JSON34 bytes

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

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

MessagePack for C++

MessagePack for Java (開発中)

MessagePack-RPC?

Rails app

C++ serverJava app

MessagePack-RPC

“Cross-language messaging library”

MessagePack

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

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

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

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

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

MessagePack> 多言語対応

MessagePackの未来

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

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

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

MessagePack> 多言語対応

MessagePackの未来

MessagePackプロジェクト

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

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

MessagePackプロジェクト

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

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

• オープンソース化

MessagePackプロジェクト

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

MessagePackの特徴

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

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

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

MessagePack-RPCの特徴

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

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

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

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

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

MessagePack> 多言語対応

MessagePackの未来

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

[0, msgid, method, params]

[1, msgid, error, result]

[2, method, params]

Request

Response

Notify

メッセージID→Parallel Pipelining

並列性

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

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

クライアント サーバ

並列性

重いタスク軽いタスク

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

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

順番を揃える(キュー)

クライアント サーバ

並列性

実装例:・MessagePack-RPC

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

時間短縮

重いタスク軽いタスク

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

プロトコル

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

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

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

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

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

MessagePack> 多言語対応

MessagePackの未来

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

Dispatcher

ServerClient

Client

Loop

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

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

イベント駆動I/OClient

Session Loop Server

Client

ServerSession Loop

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

イベント駆動I/O

sharedevent loop

Client

Client

Server

Server

Loop

Session

Session

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

並列して通信可能

イベント駆動I/O

Session PoolServer

Server

pools these connectionsLoop

Session

Session

connection

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

Dispatcher

イベント駆動I/O

sharedevent loop

Client

Server

Server

Loop

Session

Session

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

Client

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

sharedevent looptimer, signal handler,

other protocol, etc...

Dispatcher

イベント駆動I/OClient

Server

Loop

Session

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

Client

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

アーキテクチャ

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

アーキテクチャ

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

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

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

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

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

MessagePack> 多言語対応

MessagePackの未来

Futureとセッション

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

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

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

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

call_async(method1)

call_async(method2)

future1

future2

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

sharedevent loop

Server

Server

Loop

Session

Session

connection

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

sharedevent loop

Server

Server

Loop

Session

Session

connection

Future

Future

Future

Future

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

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

Session

Session

Future

Future

Future

Future

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

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

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

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

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

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

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

MessagePack> 多言語対応

MessagePackの未来

“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

多言語対応

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

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

多言語対応

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

MessagePack-RPC

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

MessagePack-RPC

Rubyフロントエンド

Java既存資産

Rubyフロントエンド

Python別プロジェクト

Java既存資産

C++計算サーバ

Haskellツール

多言語対応

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

対応言語と開発者の一部

多言語対応の問題

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

• MessagePack

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

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

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

MessagePack> 多言語対応

MessagePackの未来

シリアライザ

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

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

シリアライザ

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

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

MessagePack

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

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

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

多言語対応の問題

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

多言語対応

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

MessagePackC++の型 Rubyの型

MessagePackの型

Javaの型

msgpack::object

MessagePackObject

多言語対応

MessagePack

MessagePackの型

多言語対応

JSONの型

多言語対応

• 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

対応言語と開発者の例

まとめ

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

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

> 「柔軟の永続化」

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

MessagePack-RPC> MessagePackとkumofs

MessagePackとは?

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

MessagePack> 多言語対応

MessagePackの未来

MessagePackの未来

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

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

MessagePack Platform

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

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

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

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

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

MessagePack Platform

Powered by

Sedue

Amebaなう Sekai Camera頓智ドット

PFI

Cyber Agent

CarrotAsk Solem

Ficiaえとらぼ

ROMA-MessagePack

楽天技術研究所Cassandra-MessagePack

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

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

MessagePackと”グローバル”

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

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

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

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

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

オープンソースの原動力

開発者にエールを

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

Twitter: #msgpack msgpack@googlegroups

top related