DripとdRubyのハンズオンセミナーを東京Ruby会議でやりました。あいにくの雪の中、参加してくれたみなさんありがとう。参加しなかったみなさん残念でした!
当日の資料のPDF版はgithubにおいてあるので、Pages版をGumroadで売ろうと思います。
当日でたいくつかの質問についてコメントします。
Queueは知らないオブジェクトどう扱うのか
DRbUnknownという仕組みを使います。未知のオブジェクトをMarshal.loadするときに、特別なオブジェクトで包んで扱うことで、ストレージ的なサービスを簡単に書けるようにしています。
DRbUnknownについてはこのビデオでも述べられています。
また、ビビッドレッドオペレーション#2 04:30くらいにてDRbUnknownの実装が説明されています。
Dripのキーの発番のしくみ
Dripではキーの発番の設計が全てと言っても過言ではありません。Dripのキーの発番はRindaのTupleSpaceで排他制御された区間で行われます。
まず、Time.nowのsec, usecから作った整数がキーの候補となります。キーの候補が前回のキーと同じ/小さい場合には前回のキー+1の整数がキーとなります。(実際にはぶつかることはほとんどありませんので、開発中はキーの分解能を変えて試しています)
def make_key(at=Time.now) synchronize do |last| key = [time_to_key(at), last + 1].max yield(key) key end end def synchronize _, last = @event.take([:last, nil]) last = yield(last) ensure @event.write([:last, last]) end
TupleSpaceでキーの発番を管理するのは排他制御のためだけではありません。新しい要素の追加を待つスレッドを起こすトリガーにもなっています。
def wait(key, renewer) @event.read([:last, key+1 .. INF], renewer)[1] end
詳しくはこの英語の本を!
The dRuby Book: Distributed and Parallel Computing with Ruby
- 作者: Masatoshi Seki,Makoto Inoue
- 出版社/メーカー: Pragmatic Bookshelf
- 発売日: 2012/03/19
- メディア: ペーパーバック
- クリック: 1回
- この商品を含むブログ (24件) を見る