読者です 読者をやめる 読者になる 読者になる

マストドンに対抗して分散SNSを作った

はじめに

タイトルは釣り。s/対抗/便乗

あと、「作った」という表現は厳密には正しくなくて、以前作ったYayaka19サイトを”分散化した”というほうが近い。

記事の目的

  • いろいろと忘れてしまう前に記録しておく
  • アナウンスメント
  • 連邦全体のユーザー数を5人くらい増やす
  • サーバーが1つくらい増えたらすごい

目的に記録が含まれているというのもあって結構余計なこととか書く。

経緯

Yayaka19

もともと(Share)という名前で作り始めた。最初は、増田からパーマリンクや時系列表示を無くしたようなサービスにするはずだったが、 機能を足したり引いたりしているうちに今のような形に。 Yayaka19という名前に変えることになったのは、利用者から「Shareという名前はググラビリティが悪いのでKOKOMINECOCONAみたいな感じのエントロピー高い名前にしてほしい」と言われたため。

OStatus

OStatus*1マストドンで知ったかというと違っていて、 マストドン流行以前からGNU Socialのアカウントを持っていたため、OStatusについても知っていた。 マストドン流行以前にもYayaka19にOStatusを実装して分散SNSにしようという話はしていたが、 周りは「自分ならOStatusは実装したくない」という反応で、自分も実装したくなかった。 また、独自プロトコルで実装する(Yayakaプロトコル構想)という考えもあったが、 そもそもYayaka19を分散SNS化する必要はあるのか?分散SNSの需要は本当にある?というところで確信がなかったため、 時間をかける気は起きなかった。

そんなところに、あの日本でのマストドン流行が起こった。 少なくとも私の観測範囲では流行っていることを確認できた。 GNU Socialと違っていろんな界隈でたくさんのアカウントが作られていたし、Twitterでの投稿数が減少した人も見た。 少なくとも私の観測範囲では流行っていることを確認できた、分散SNSにも一定の需要があると判断し、 独自プロトコル(Yayakaプロトコル)を用いてYayaka19を分散SNS化することを思い立った。

設計と実装

とりあえず方針としてはサーバー同士をWebSocketで接続して、なにかあるたびにメッセージを送受信する。 例えば、あるユーザーが外部サーバーのユーザーをフォローしていたら、タイムラインをロードする度に外部サーバーから投稿を取得する。 他には、新しい投稿があったときに投稿者のフォロワーに外部サーバーのユーザーがいれば、新しい投稿を外部サーバーに送る。

一応Yayakaプロトコルにする予定があるので、ある程度留意して設計した。

主なモジュール

実装

実装するには、まず、WebSocketのサーバー側とクライアント側を作る必要がある。 しかし、両方を自分で作るのは面倒だったため、Yayaka19が使っているWebフレームワークであるPhoenixフレームワークのChannelsという機能を無理やりサーバー側として使うことにして、 クライアント側だけ自作した。それはライブラリとして別に公開している(phoenixchannelclient)。 SocketRegistryにはElixirのRegistryという比較的新しいモジュールを利用した。 全体的に実装していて楽しかった。

結果と反応

分散化できた。 結構面白がってもらえている気がする。 早速、私以外が運営するサーバー(19.fubaiundo.org)が立ったので良かった。

画像集

プロセスの関係図

f:id:ryo12redstone:20170511013401p:plain

VisualixirというツールでErlang VMのプロセスの関係図を出した。 真ん中の花火みたいなやつが多分HTTPのコネクションプール、左下のはRDBのコネクションプール、右側はフレームワークのやつ、という感じなので左上が実装した部分。

タイムライン読み込みの状態

f:id:ryo12redstone:20170511013507p:plain

errorとかtimeoutとかloadingとかになる。この表からRetryもできる。

リモートフォローの様子

f:id:ryo12redstone:20170511013636p:plain

写真が暗いのはブラウザの拡張機能でページが黒くなってるから。

military or bomb

f:id:ryo12redstone:20170511013734p:plain

if式くれ。

AA

f:id:ryo12redstone:20170511013850p:plain

ウーーイヌ

今すぐダウンロー

f:id:ryo12redstone:20170511014006p:plain

収益

f:id:ryo12redstone:20170511014052p:plain

サーバー代は700$/monthミス

サーバー代は$7/month

今後のアレ

  • Remote Mystery(やばい機能)
  • テスト書く
  • Dockerイメージ
  • Yayakaプロトコル
  • 外側をOStatusに見せるためのプロキシ
  • Editor Pluginsが流石にゴミ置き場すぎる

最後に

特になし。

リンク

*1:マストドンGNU Socialが使っている分散SNSのためのプロトコル