rinda, druby · druby e3vczw \q 3vczwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å i b...

86
Rinda, dRuby answering the RubyConf, RubyKaigi Masatoshi SEKI

Upload: others

Post on 01-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Rinda, dRubyanswering the RubyConf, RubyKaigi

Masatoshi SEKI

Page 2: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

重要なことを先に

• 先に

Page 3: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

重要なこと

• ’05 夏リリース

• まだ初版買えます

dRubyによる

関 将俊 著

分散・Webプログラミング

Page 4: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

amazon.co.jpdRubyによる

関 将俊 著

分散・Webプログラミング

buy now!

Page 5: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

私について

• 自称プログラマ• 今日はAgileの人じゃないよ

• 打たれ弱い

Page 6: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

私について

• Rubyの人になりたい

• さっぱりRubyな依頼こないよ?

XP

Ruby

Page 7: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

products

• ERB

• dRuby

• Rinda

• RWiki

• Div

• Koya

• ...

Page 8: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

users

• ERB

• dRuby

• Rinda

• RWiki

• Div

• Koya

• ...

otherRindadRuby

ERB

Page 9: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

users

• ERB

• dRuby

• Rinda

• RWiki

• Div

• Koya

• ...

other

RindadRuby

ERB

Page 10: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

ego-search

• ERB

• dRuby

• Rinda

• RWiki

• Div

• Koya

• ...

other

Rinda

dRuby

ERB

Page 11: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

報われない愛

otherRindadRuby

ERB

other

Rinda

dRuby

ERB

ユーザ数 作者の愛情

Page 12: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

愛の反対は無関心

• ERBを愛してないわけじゃない

Page 13: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

でも今日は

• Rindaを中心に

• ERBはまた今度

about me

Rinda

dRuby

Page 14: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

agenda

• dRuby, Rindaの紹介

• いくつかの発表に言い訳• RubyKaigi 2006

• Rinda and DRb in the Real World.

• Scaling Twitter

Page 15: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

言い訳駆動

• 最初のリリース以降のモチベーション• コンセプト製品みたいのばっかり• そのくせ指摘されると打たれ弱い• 言い訳をするように本を書いたり‥

Page 16: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

RubyKaigi 2006

dRuby, Again.

dRubyをもう一度思い出してみよう今日も古い話ばっかり

Page 17: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

dRubydRubyのやること

Rubyのメッセージングを拡張別のプロセスのオブジェクトのメソッドを起動する

Rubyなので

IDL不要proxyは一種類だけ

ブロック付きメソッド

なぜ動くのかProcは参照渡しyieldはProcへの操作

で?

dRubyをなにに使うの?

いろんな分散

配置プロセスマシン機能ちょっと豪華な通信の代替手段

寿命といえば永続化

永遠の永続化比較的に永続化一方よりは長生きだ

長命なオブジェクト

長生きするオブジェクトの方が自然なときWeb UIとか

遺言に苦労するなら

はじめから長命なオブジェクトはいかが?つーかそのMVCでいいの?

Web UI 2.0

Webブラウザ HTTP Web UI アプリケーション

Event !

だいぶ短命長生きだと自然

長生き

Page 18: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

dRubyのやること

Rubyのメッセージングを拡張

別のプロセスのオブジェクトのメソッドを起動する

オブジェクトの交換

Page 19: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Object(1) メッセージ送信

Object(2) メッセージ転送

(3) メソッド起動

プロセスを越える

Page 20: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

実験

二つのirbを使って話し合う一方はHashを公開

Page 21: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

front

システムへの入り口、きっかけURIで指定するdRubyのシステムに一つ以上

Page 22: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

irb

cinq:~ mas$ irb --simple-prompt --noreadline>> require 'drb/drb'=> true>>

cinq:~ mas$ irb --simple-prompt --noreadline>> require 'drb/drb'=> true>>

OSXでThreadがスイッチしないときに

Page 23: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

{}をfrontに

>> DRb.start_service('druby://localhost:12345', {})=> #<DRb::DRbServer:0x1c1e48....>>>

{}とURIを結びつける

Page 24: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

frontを参照

>> DRb.start_service=> #<DRb::DRbServer:0x1c97c4...>>> ro = DRbObject.new_with_uri('druby://localhost:12345')=> #<DRb::DRbObject:....>>>

URIを参照する

Page 25: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

{}をいじる>> ro['client'] = 'Hello, Again'=> "Hello, Again">>

>> DRb.front=> {"client"=>"Hello, Again"}>> DRb.front['server'] = 'Hello, World.'=> "Hello, World.">>

>> ro['server']=> "Hello, World.">> ro=> #<DRb::DRbObject:...">>> ro.keys=> ["client", "server"]>> ro.values => ["Hello, Again", "Hello, World."]>>

Page 26: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

オブジェクトの交換

Marshal

dumpableNumber, Boolean, String

clone

can’t dumpProc, Thread, File

reference

Page 27: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Threadは参照渡し

>> DRb.front['thread'] = Thread.current=> #<Thread:0x1df7cc run>>>

>> ro['thread']=> #<DRb::DRbObject:...>>> ro['thread'].status=> "sleep">>

Page 28: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

値渡しはコピー

>> DRb.front['client']=> "Hello, Again">>

>> ro['client']=> "Hello, Again">> ro['client'].reverse! => "niagA ,olleH">> ro['client']=> "Hello, Again">>

Page 29: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

同期

Thread同期の仕組みもそのまま

もちろんTupleSpaceも

Page 30: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

で?

dRubyをなにに使うの?

Page 31: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

いろんな分散

配置プロセスマシン

機能ちょっと豪華な通信の代替手段

Page 32: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

配置と寿命

オブジェクトはプロセスに在る住いが異なる = 寿命が異なるプロセスより長命なオブジェクト

Page 33: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

寿命といえば永続化

永遠の永続化比較的に永続化一方よりは長生きだ

Page 34: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

長命なオブジェクト

長生きするオブジェクトの方が自然なとき

Web UIとか

Page 35: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Rindaもっとかっこいいやつ

並列処理糊言語 LindaとRinda動的な構成変更 Ring使わなくても素振りしておけ

Linda

並列処理糊言語タプルとタプルスペースパターンマッチング

Lindaの協調

outinとrdパターンで指定ブロックできる参加者はタプルスペースだけを知ってる

かっこいい並列処理

TupleSpace

Engine

Engine

Engine

Client

Client

Tuple Spaceだけを知っている

Rinda

RubyによるLindaの実装dRubyを意識してくれるTupleはArray|Hashで

Page 36: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Linda

並列処理糊言語タプルとタプルスペースパターンマッチング

Page 37: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Lindaの協調

outinとrdパターンで指定ブロックできる

参加者はタプルスペースだけを知ってる

Page 38: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

かっこいい並列処理

TupleSpace

Engine

Engine

Engine

Client

Client

Tuple Spaceだけを知っている

Page 39: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Rinda

RubyによるLindaの実装

dRubyを意識してくれる

TupleはArray|Hashで

Page 40: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

TupleSpace

>> ts = Rinda::TupleSpace.new=> #<Rinda::TupleSpace:...>>> DRb.front['ts'] = ts=> #<Rinda::TupleSpace:...>>>

>> it = DRbObject.new_with_uri('druby://localhost:12345?ts')=> #<DRb::DRbObject:...>>> ts = Rinda::TupleSpaceProxy.new(it)=> #<Rinda::TupleSpaceProxy:...>>>

TupleSpaceProxyはdRuby下で安全に動作させるためのもの

Page 41: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

writeとtake

>> ts.write([:seki, :age, 20])=> #<Rinda::TupleEntry:...>>> TupleSpace

:seki :age

write

20

Page 42: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

writeとtake

>> ts.write([:seki, :age, 20])=> #<Rinda::TupleEntry:...>>>

>> ts.take([:seki, :age, nil]) => [:seki, :age, 20]>>

TupleSpace

:seki :age

take

20

Page 43: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

待ち合わせ

>> ts.take([:seki, :age, nil])

TupleSpace

take

Page 44: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

待ち合わせ

>> ts.write([:seki, :age, 20])=> #<Rinda::TupleEntry:...>>>

>> ts.take([:seki, :age, nil])

TupleSpace

:seki :age

writetake

20

Page 45: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

待ち合わせ

>> ts.write([:seki, :age, 20])=> #<Rinda::TupleEntry:...>>>

=> [:seki, :age, 20]>>

>> ts.take([:seki, :age, nil])

TupleSpace

:seki :age

take

20

Page 46: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Answering

• dRuby, Again.

• Scaling Twitter

• Rinda and DRb in the Real World

• mput.dip.jp

• Nick Sieger’s blog

• kiwamu訳

Page 47: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Rinda and DRb in the Real World

• Glenn Vanderburg 返事もらえなかった‥

• mputさんやkiwamuさんの日記を参照

Page 48: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Rinda and DRb in the Real World

• Tupleの設計はプロトコル設計

• SPOFだよ

• RingServerは鬼門

• 不揮発性のオブジェクトID

• 2004年から開発停まってるじゃん

Page 49: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Rinda and DRb in the Real World

• Tupleの設計はプロトコル設計

• SPOFだよ

• RingServerは鬼門

• 不揮発性のオブジェクトID

• 2004年から開発停まってるじゃん

Page 50: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Tupleの設計

• Tupleの設計はプロトコルの設計

• 伝票• RDBMSのテーブルの設計は?

• なんだろ。帳簿??

Page 51: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Tupleで表現するもの

• RPCの要求とその返信

• 分散データ構造• ストリーム• キャッシュ• ...

Page 52: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

テンプレート

• Tupleをパターンで指定

• read, takeで

• ===で比較

• nilはワイルドカード

Page 53: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

RPCなTuple

• メッセージ• 識別子• 具 / データ

メッセージ 識別子 具

Page 54: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

RPCなTuple

• 値で指定• ワイルドカードはまずない

メッセージ 識別子 具

Page 55: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

RPCなTuple

• ほとんどの場合nil

• 返信待ちでは値の場合も• ときどき範囲 (Class, Regexp, Range)

メッセージ 識別子 具

Page 56: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

RPCなTuple

• ほとんどの場合nil

• 要素数は合わせてね

メッセージ 識別子 具

Page 57: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

RPCなTuple

メッセージ 識別子 具

:snapshot 12345 “http://foo/bar”, 320, 240

Page 58: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

RPCなTuple

メッセージ 識別子 具

:snapshot 12345 “http://foo/bar”, 320, 240

:snapshot nil nil, nil, nil

Page 59: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

RPCなTuple

メッセージ 識別子 具

:snapshot 12345 “http://foo/bar”, 320, 240

:snapshot nil nil, nil, nil

:snapshot_done 12345 “img_320_240_12345.jpg”

Page 60: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

RPCなTuple

メッセージ 識別子 具

:snapshot 12345 “http://foo/bar”, 320, 240

:snapshot nil nil, nil, nil

:snapshot_done 12345 “img_320_240_12345.jpg”

:snapshot_done 12345 nil

Page 61: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Scaling Twitter

Rinda

• Shared Queue (TupleSpace)

• Built with DRb

• RingyDingy makes it stupid easy

• See Eric Hodel’s documentation

• O(N) for take(). Sigh.

Big Bird.(scaling twitter)

Page 62: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Sigh.

• Shared Queue (TupleSpace)

• O(N) for take(). Sigh.

Page 63: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

O(N)

• メッセージだけで探す• 要求が溜まってるとき、すぐにマッチ• まぁまぁO(1)じゃない?

:snapshot nil nil, nil, nil

Page 64: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

まぁまぁO(1)?

• あれれ• Array#deleteしてた

• delete_atに修正しました

• おまけ: rindexで末尾を先に削除

Page 65: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

不公平な検索

• 事前にメッセージごとに分類• 先頭の要素がSymbolの場合のみ

• StringやIntegerは===の扱いが難しい

• ほんとにO(1)っぽい

:snapshot nil nil, nil, nil

Page 66: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

不公平な検索

• tuple[0]はSymbolにしておくと効率よい

• そういうケースだけ特別扱いするよ

a Symbol nil nil, nil, nil

Page 67: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Rinda遅いんですけど

• さっきロビーで• ruby_1_8を試して

Page 68: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Rinda and DRb in the Real World

• Tupleの設計はプロトコル設計

• SPOFだよ

• RingServerは鬼門

• 不揮発性のオブジェクトID

• 2004年から開発停まってるじゃん

Page 69: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

RubyKaigi 2006

• サーバ側がマシンがトラブるとエラーになります。マスターを複数に出来るといいなと思うんですが。(森脇さん)

• 今聞いたんで、これから考えます。(咳)

Page 70: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

考えた

• さっきの状態で生き返るTupleSpace

• ただしTupleの状態だけ

• take, readで待ってた人は再試行plz

• 自動的な再起動は別途• Ring ?

Page 71: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

永続化

• タプルの内部表現の状態を外部に記録• 変更も記録• 再起動時に記録された情報で再構築

Page 72: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

PTupleSpace

• 永続版TupleSpace

• TupleとTupleEntryの永続化

• Tupleのcancelなどのハンドル

• Tupleを保存するTupleStoreと一緒に

Page 73: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

TupleStore

• Tupleの情報をメモしとく

• ログファイルのTupleStoreLog

• HashのTupleStoreSimple

• プロセスの寿命の違いを利用• 開発中向け

• RDBなら安心する人は自分で書いてね

Page 74: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

• 書くだけ

TupleStore

Log Marshal

PTupleSpace

log

Application

Application

Application

Page 75: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

ログから生き返る

• 読むだけ

TupleStore

Log Marshal

PTupleSpace

log

Page 76: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

再起動の通知は

• Ringが使えるかも

Page 77: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

TupleStoreの配置は

• PTupleSpaceと同じマシンに

• dRubyで好きなところに

Page 78: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Rinda and DRb in the Real World

• Tupleの設計はプロトコル設計

• SPOFだよ

• RingServerは鬼門

• 不揮発性のオブジェクトID

• 2004年から開発停まってるじゃん

Page 79: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Rinda and DRb in the Real World

• Tupleの設計はプロトコル設計

• SPOFだよ

• RingServerは鬼門

• 不揮発性のオブジェクトID

• 2004年から開発停まってるじゃん

Page 80: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

不揮発な参照

• object_idはそのプロセスだけで有効

• 再起動時に困る

Page 81: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

不揮発な参照

• DRbIdConvをカスタマイズ

• ログのIDを用いた特別な参照を作る

• 再起動してもTupleEntryの参照が有効

Page 82: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

Rinda and DRb in the Real World

• Tupleの設計はプロトコル設計

• SPOFだよ

• RingServerは鬼門

• 不揮発性のオブジェクトID

• 2004年から開発停まってるじゃん

Page 83: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

2004年で停まってる

• 変えたよ。• 変えないと、ダメなの?

Page 84: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

まとめ

• 関心をもってくれたみなさまに感謝• RubyKaigi 2006

• Rinda and DRb in the Real World.

• Scaling Twitter

Page 85: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

それから

• たまにはERBの言い訳をしたい

• なぜ行に分割するのか• メソッド化して使うのがERB way

Page 86: Rinda, dRuby · dRuby E3VCZw \q 3VCZwÝ¿· ´ï¬ ¦ Á wÓé·µw¦Ò´ £«ÄwÝ ¹¿Å I b 3VCZswp *%-Æ A QSPYZx° ¨iZ Òé¿« ÇVݹ¿Å se X wT

toRuby 4h

• とちぎRubyの勉強会

• 6/23 西那須野公民館

• 豪華ゲスト• 豪華レギュラー