P2P2chが動くしくみについて。
まずP2P2chは、p2pscalaprotoという補助モジュールを利用しています。P2P2chは、P2P処理のほとんどをこのモジュールに頼っています。
p2pscalaprotoは、Akkaを利用して分散処理を実行しています。
Akkaは、Java/Scalaなどで動作するアクターベースの並行制御ライブラリです。
ノード間の通信は、すべてAkkaを利用して処理しています。
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に格納されます。