Ruby バージョン1.8 は,そのグリーンスレッドモデルの性能の低さが以前から批判されている。Luc Castera氏は RubyNation コンファレンスで,Ruby とタプルスペースによる並列プログラミングの発表を行った。コンピュータ世界のさまざまなスレッディングモデルについて Ruby 1.8,Ruby 1.9,JRuby,Erlang などを例に説明した後,氏は Ruby のマルチプロセス化を紹介した(図と引用は発表資料のものである)。
- 利点:
- 共有メモリが不要
- マルチCPUのメリット(パフォーマンス)を享受できる
- ブロックシステムコールでもすべてのスレッドがブロックされない
- スケーラビリティ
- 耐障害性(フォールト・トレランス)
- 欠点:
- プロセスの生成・実行・クリーンアップが高価
- メモリ使用量が多い(Ruby VM をプロセス毎にロードするため)
- プロセス間通信の手段が必要!
プロセス間通信を実現するための手段は数多くある。データベース(クラスタ構成のアプリケーションサーバ( Mongrel,Thin など)で使用される),RabbitMQ(Nanite氏のソリューション)などのキュー,DRB,ActiveMQ,... それから,タプルスペース。
氏は Rinda と氏自身の開発した Blackboard という,2つのタプルスペース実装を比較している。タプルスペースとは,並列的にアクセス可能なタプルのレポジトリを提供するものだ。一般的にタプルはライト(write:タプルのタプルスペースへの書き込み),リード(read:タプルスペースからのタプル読み込み),テイク(take:タプルスペースからのタプル読み込みと削除),という3つのアクセスプリミティブを提供する。
Linda は David Gelernter 氏と Nicholas Carriero 氏によって定義された協調モデル(coordination model)であり,グローバルなオブジェクト協調の概念をサポートする。
Linda の Ruby による実装が Rinda であり,Ruby の組込ライブラリとなっている。 Rinda では タプルを t1 = [:add, 5, 9]
のように記述する。クライアントはこれを,例えば与えられた数値の和を求めるタスクのように解釈する。
Rindaの大きな欠点は永続性がないことである。スペース内のすべてのタプルは停止またはクラッシュによって失われてしまうのだ。氏が Blackboard の開発に取り組んだのはこのためである。Blackboard はキー・バリュー型データベースである Redis 上に構成されたタプルスペースの実装であり,永続性を持っている。
[ Redis は] memcached に似ていますがデータセットが揮発的( volatile )ではありません。値として文字列が設定できるのは memcached とまったく同じですが,リストやセットを要素として,アトミックな操作で push/pop することも可能となっています。
以下はAPIの使用例である。
ts = Blackboard::TupleSpace.new ts.write [:calculator, :add, 1, 2] ts.take [:calculator, :add, nil, nil]
次表は Rinda と Blackboard の差を示すベンチマーク結果である(発表資料より)。
Rinda | Blackboard | |
Write (1000) | 0.042749 | 0.253068 |
Take (500) | 0.082744 | 15.844250 |
Read (500) | 0.020098 | 20.098478 |
現在の実装は最初のイテレーションである。氏は Redis から,Ruby などサードパーティ言語からのコールが容易なカスタムベース Erlang Blackboard の実装へ移行する計画を持っている。