研究会

機械学習、データベース、分散システム、その他技術的なことを書く研究会です

webrtc-chord のバージョン 1.0.0 をリリースしました

概要

以前公開した WebRTC による Chord の実装 webrtc-chord のバージョン 1.0.0 をリリースしました。

tsujio/webrtc-chord - GitHub

詳細

WebRTC で DHT の一種である Chord を実装した webrtc-chord を公開していましたが、この度めでたくバージョン 1.0.0 をリリースすることができました。

公開以来、様々な人からフィードバックを頂きました。特に Scholar Ninja 作者の Jure Triglav さんからは実世界で運用した上での重要なアドバイスを頂きました。

これまでフィードバックを頂いた皆様に感謝の気持ちを表しつつ、今後も多くの人に使っていただけるように改良を続けていきたいと思っています。

内部的な変更点

ノード探索プロトコルの変更

Chord は Finger Table を参照しながら二分探索でノードを探しますが、この探索を Recursive に行っていたのを Iterative に行うようにしました。

図で表すとこんな感じです。

  • Recursive 版

f:id:ntsujio:20140705160459p:plain

  • Iterative 版

f:id:ntsujio:20140705160559p:plain

Recursive 版では N_i

  • N_(i+1) に request を送った後、かつ
  • N_(i-1) に response を送る前

N_i が 離脱するとそのリクエスト全体が失敗し、しかも送信元である N_1 はそのことをタイムアウトでしか知ることはできませんでした。

これはノードが頻繁に離脱する P2P 環境には適した設計ではありませんでした。

そこで Iterative 版のように、一旦 N_i から応答を受信すればいつ N_i が離脱してもリクエストが失敗しないようにしました。

コネクションのクローズの通知

ノードがコネクションを使って相手にデータを送信すると同時に相手がそのコネクションを閉じてしまい、結果としてデータが相手に届かないという問題がありました (しかもそのことに送信元は気付けない)。

そこでコネクションを閉じる側はそれ以上データを送ってこないようにあらかじめ shutdown 要求を送信し、それから一定時間待ってコネクションを閉じるようにしました。

高速化

手元の Finger Table を定数時間でルックアップできるようにしたり (当たり前)、ノード ID の比較のアルゴリズムを改良したりしました。

またユーティリティーライブラリとして underscore.js を利用していましたが、高速化のために Lo-Dash を代わりに使うようにしました。

まとめ

  • webrtc-chord 1.0.0 をリリースしました

  • 利用事例が増えるといいな

  • OSS を英語で公開するの大事