しくみ

P2P2chが動くしくみについて。

P2P2chの中身

まずP2P2chは、p2pscalaprotoという補助モジュールを利用しています。P2P2chは、P2P処理のほとんどをこのモジュールに頼っています。

p2pscalaprotoは、Akkaを利用して分散処理を実行しています。
Akkaは、Java/Scalaなどで動作するアクターベースの並行制御ライブラリです。
ノード間の通信は、すべてAkkaを利用して処理しています。

p2pscalaproto

p2pscalaprotoの役割は、データの保管とノードの保守です。
データの保管とは、受信したデータを保管し、必要があれば送信する役割です。大きなファイルの分割や再構成も行います。
ノードの保守とは、ノード同士の結合を保ち、異常なノードがあれば切断して、正常なデータやメッセージの伝播を保障することです。

p2pscalaprotoは、データの保管にDHTと呼ばれる仕組みを利用します。DHTとは、分散ハッシュテーブルの略です。詳しくはWikipediaを参照ください。
p2pscalaprotoは、DHTを実現するアルゴリズムとしてChordを利用します。
Chordは、ノードに160ビットのIDを付与し、保管されようとするファイルのSHA-1ハッシュ値(160bit)を算出し、IDとハッシュが最も近い位置にあるノードにデータを保管する方式です。詳しくは、ChordアルゴリズムによるDHT入門というページに詳細が解説されています。

ちなみにP2PのScalaの実装のPrototypeなのでp2pscalaprotoです。

Chordを実装するにあたり必要となる処理の一部をAkkaが代行してくれました。

動作概説

P2P2chはレスをテキストファイルでDHTに保管し、レスとスレッドの対応関係をローカルのデータベースに保管します。
ユーザがスレッドを表示しようとすると、P2P2chは対応するスレッドのIDを持つレスをローカルのデータベースから抽出し、時刻でソートして表示します。

ローカルのデータベースは、定期的に他のノードと同期します。
最後の同期から一時間遡った時点からの情報を周りのノードに要求し、ローカルに格納しています。

そのため、レスアンカーはほとんど意味を成さなくなります(途中のレスが後から拾われることもあるため)。

図説 スレッドのロード

スレッドを立てる際は、これとほぼ逆の処理が行われます。
スレッドの情報はP2P2chによりテキストデータとしてシリアライズされ、p2pscalaprotoによりDHTに格納されます。
スレッドへのレスも同じようにテキストデータとしてシリアライズされ、p2pscalaprotoによりDHTに格納されます。

GO TO INDEX

Written by Momijikawa

inserted by FC2 system