TwitterをP2Pで実現する方法をもう少し考えてみる
第2回Twitter研究会は今年7月~9月に開催する予定になりそうだ。ということで、そろそろ講師用MLを作ることを考えている。次回のTwitter研究会では私も講師陣に加わってTwitterライクなサービスをP2P(というよりもクラウドと言ったほうが適切かもしれない)で実現するための手法について議論したいと考えている。本記事はその議論のためのメモである。
さて、TwitterをP2Pで実現する方法については、既に本Blogにおいてほぼ3年前に議論している。本記事はその記事に対して実現方式等を補足したものである。
Tomo's Hotline [P2P]TwitterのP2P化を考えてみる
TwitterのようなサービスをP2Pあるいはクラウドで実現するメリットはスケーラビリティの向上と運用コストの抑制である。
P2PシステムとしてDHTを利用する。今で言うとkey-valueストレージをイメージしてもらえば充分だ。DHTはkeyを引数としてvalueを引き出すことができる。つまりDHTとは分散化されたデータベースようなものだ。
DHTの詳細な説明は拙著「P2P教科書」を読んでもらうこととして、本論に移ろう。
なお、今回はアイデアを紹介するのが目的であるので、各種用語の定義、議論の厳密さよりもわかりやすさを優先する。
[1]基本的なツイートのデータ蓄積方法
前提として各ユーザに対してユニークなアカウントを払い出しているとする。(ユニークな払い出しの実現方法については後述。)
例として@toremoro21というアカウントのユーザがいたとする。今ハッシュ関数をhash()と定義する。
各ノードには一意のノードIDがDHTによって割り当てられている。
@toremoro21に対する各ツイートはノードID=hash(@toremo21)となるノードに格納する。
次の目標は各ツイートにユニークな識別子をつけることである。
今ツイート識別子としてアカウント名+(各アカウントに対するユニークな識別子)で割り当てることを考える。この(各アカウントに対するユニークな識別子)として一番単純なのは、世界標準時(GMT)だろう。GMTを使うと各ツイートの時系列が簡単に把握できる。つまり、タイムライン等における時系列表示が容易に実現できる。当然端末の時間の誤差などが課題であるが、ツイートのように順番が多少ずれていても、あまり問題のならないサービスであればGMTで事足りるだろう。なお、BOTのように大量にツイートを作成するアカウントがいる場合は、GMTの後に各GMT内単位時間内での発言に対するシーケンス番号を付け加えることが考えられる。
話を単純にするため、各ツイートの識別子はアカウント名+区切り文字+発言したGMTで記述することにする。区切り文字を*とすれば、ツイートの識別子の例は@toremoro21*20100503となる。区切り文字より前の情報から、ツイートを発言したアカウント名及びこのツイートを格納しているノードが判明する。区切り文字以降から発言した時間がわかる。
次に、アカウントを一意に作成する方法について述べる。議論を単純にするため、P2Pシステムに悪意のあるノードがいないとする。今、あるノードAがアカウント@toremoro21を作成しようとする。ノードAはノードID=hash(@toremoro21)となるノードと通信を行い、アカウント@toremoro21がまだ作成されていないことを確かめる。もし、既に@toremoro21のアカウントが作成されていたら、別のアカウントを作成し先ほどと同様な手順で既存アカウントと重複していないか確認を行う。
[2]タイムラインの表示
タイムラインを表示する方法として、各ユーザがフォローしている各アカウントのツイートを管理しているノードに対して情報の更新を定期的に確認することが一番シンプルである。ただ、この方法はDHTシステムに対して大きな負荷が掛かる。
よりスマートなタイムラインの実現方法は次のとおり。タイムラインを表示したいノード(ノードPとする)はフォローしている各アカウント(@toremoro21とする。)のツイートを管理しているノード(その一つをノードQとする)に対して、ツイートが更新したときに自ノードに対してプッシュ通知を行うように、指令を出す。つまり、ノードQは@toremoro21に関わるツイートの情報更新が行われた場合、ノードPに対してプッシュ通知を行う。通知方法としては、単にツイートが更新されたことを知らせる方法、更新されたツイートに関わる識別子を知らせる方法、更新されたツイートの内容全体を通知させる方法などがあるだろう。
[3]リツイートに対する処理
リツイートについては、引用したツイートに対する識別子情報も含めてDHTシステムに格納する。これによって、引用したツイートを他人が参照することが容易に可能である。なお、引用するときに引用元のアカウントを含めるため、後述の[6]の処理も行う。引用元ツイートにハッシュタグが含まれた場合、後述の[5]の処理も行う。
[4]ダイレクトメッセージに対する処理
@toremoro21に対してダイレクトメッセージを送信をする場合、hash(@toremo21)をノードIDとするノードにダイレクトメッセージを格納する要求をする。
[5]ハッシュタグに対する処理
@toremoro21が#twitterconfを含むツイートを行う場合、hash(@toremoro21)をノードIDとするノードに当該ツイートを格納するだけでなく、hash(#twitterconf)をノードIDとするノードにもツイートを格納する。これによって、#twitterconfを含んだ発言を他人が容易に参照できる。
[6]アカウントを含むツイートを含む処理
これも先ほどのハッシュタグIDと同じ議論である。あるアカウントを含んだツイートは、hash(アカウント)をノードIDとするノードにも格納する。これによって、各アカウントを含んだ発言を他人が容易に参照できる。
このようにP2PであってもDHTを使えば、Twitterライクなサービスはある程度容易に実現できると考えられる。
| 固定リンク
「P2P」カテゴリの記事
- WebRTCを実現するためにSTUNだけでなくTURNも必要な理由(2015.01.08)
- [P2P]P2Pストリーミングのサーベイ文書について(2014.11.09)
- Winnyの開発者、金子 勇氏の急逝を悼んで(2013.07.07)
- 「分散ハッシュシステムでのNAT超えの考察」に対する質問について(2012.12.16)
- [P2P]Websocketでブラウザ間P2P通信は実現できるか?(その2)(2011.11.20)
この記事へのコメントは終了しました。
コメント