ブログに戻る

フォロー&ご登録

コミュニティスポットライト : Una Thompson 氏が語る、Jortage で Fediverse をより管理しやすくする方法

Hannah Aubry

Senior Community Manager, Fastly

Fediverse 独自の機能の多くは分散化によって実現されています。一方、分散化が理由となりインスタンスの管理が非常に困難になっているのも事実です。Fast Forward プログラムのメンバーで Jortage の管理者でもある Una Thompson 氏は、Fastly を利用して分散化に伴う「コンテンツの重複」の問題を解決しています。そこで私たちは、この問題とその解決策について Thompson 氏に詳しくお話を伺うことにしました。

小さいながらも相互につながれたコミュニティの形成を可能にし、自分たちでコンテンツを管理しつつ連携したい相手を選べる Fediverse は、素晴らしい空間を提供しています。Fediverse では、ユーザーが自由に自分のデータを所有し、インスタンス間でデータを移動させることができます。しかし、分散型ソーシャルネットワークが提供するこの「自由」にはマイナスの側面もあるのです。 

フェデレーションでは、メディアオブジェクトがサーバー間で行ったり来たりするなど、大量のコンテンツが飛び交うことになります。誰かが投稿するたびに、投稿者のインスタンスによってステータスとオブジェクトが投稿者をフォローしている全員のインスタンスにプッシュされ、フォロワーのインスタンスによってそれらがダウンロードされます。さらに各インスタンスによって個別にストレージプロバイダーにアップロードされるため、投稿者のフォロワーの数だけオブジェクトの重複が発生します。

Thompson 氏は Jortage によって非常にシンプルな方法でこの難しい問題を解決しました。Jortage は、オブジェクトストレージとホスティングを提供するコミュニティプロジェクトで、メンバーのオブジェクトストレージの重複を排除し、メンバーの全体的なストレージコストを削減します。世界中に散らばる70インスタンスで Jortage が使用される中、高速なメディア配信を維持するため、同プロジェクトでは Fastly を利用してダウンロードの高速化とキャッシュを実現しています。Fastly を活用することで、Jortage は独自のグローバルサーバーへの投資を回避してコストを低く抑えながら #CatsOfMastodon のブラウジング体験を高速化し、より魅力的なものにすることに成功しました。

Hannah : Jortage を作ろうと思ったきっかけは何ですか?

Thompson 氏 : よくある話ですが、何か他のことをしていた時に思いついたんです。ある時、メディアのフェデレーションがうまく機能する方法を何の気なしに考え始めて、「これは絶対無理だろう」というアイディアを思いつきました。実際にそのプロトタイプを構築してみたところ、非常にうまくいったのです。そこでそれをスケールアップし、他のいくつかのインスタンスの管理者にも参加を呼びかけ、今に至ります。

そしてある時、Gargron [Mastodon の CEO、Eugen Rochko 氏のハンドル名] からダイレクトメッセージが届いて、「(Mastodon が受信したメディアの処理に使用している) FFmpeg と ImageMagick は非決定的なのに、一体どうやって Jortage は機能しているのか」と聞かれました。正直、よく分かりません。こんなにうまくいくはずがないようです (笑)

Hannah : では、その仕組みについて教えていただけますか? 

Thompson 氏 : ストレージプールが機能する基本的なプロセスについて解説しますね。まずファイルがアップロードされるとハッシュされ、MariaDB データーベースにハッシュのパスへのマッピングが保存されます。そして新しいファイルが私たちのバックエンド・ストレージ・プロバイダーの Wasabi にアップロードされ、ハッシュがファイル名として使用されます。pool.jortage.com</u> へのリクエストはデータベースのパスを検索し、一致するものが見つかった場合、関連するハッシュと一緒に blob.jortage.com</u> へのリダイレクトを返します。pool は poolmgr で実行されているサーバーをポイントし、blob は Wasabi を直接ポイントするように設定されています。

ストレージプールの CDN 接続は非常にシンプルです。Fastly の設定で最も複雑だったのは、ストレージプールに非常に特化したルートパスのリダイレクトの部分でした。また、Mastodon ではアップロードの上限サイズが 40 MB だったので、jortage が動画を処理するには、セグメントキャッシュ</u>機能を有効にする必要がありました。   

Jortage はカスタム poolmgr</u> で実行されています。まさに「巨人の肩に乗っている」プロジェクトであり、S3Proxy</u>Apache JClouds</u> の存在がなければ、このプロジェクトの実現ははるかに難しかったでしょう。poolmgr は、Mastodon (他にも Pleroma、Akkoma、Misskey など) が通信する S3 と互換性のある API を公開しています。しかし、Mastodon インスタンスのストレージの大半が S3 プロバイダーなので、70近いインスタンスが Fastly のメリットを感じているはずです。(DNS の伝達を待つ間にいくつか大雑把にベンチマークを実施したところ、キャッシュされていないコンテンツのリクエストも含め、Fastly の合計ダウンロード時間は前のベンダーに比べて2倍から5倍ほど速かったです。)

Mastodon の最も重い部分は CDN で解決することができません。例えば、ジョブマネージャー (Sidekiq) やフェデレーションリクエストのプロセスなどは、実際 CDN によって悪化します。Cloudflare の背後で実行されているインスタンスが原因不明のフェデレーション問題を抱えているのが良い例です。ただし、メディアはファイルサイズが大きいのも確かです。

DNS の伝達を待つ間にいくつか大雑把にベンチマークを実施したところ、キャッシュされていないコンテンツのリクエストも含め、Fastly の合計ダウンロード時間は前のベンダーに比べて2倍から5倍ほど速かったです。

Hannah : フェデレーションの最も重い部分に関して、フェデレーションリクエストと Sidekiq をより効率的に実行できるソリューションがあると思いますか?

Thompson 氏 : 本当の意味で「効率的」と呼べる Web ベースのサービスは存在するのか、むずかしいとことですね。JSON が行き来する RESTful サービスは、とても効率的とは言えません。もちろん私は ActivityPub の専門家ではありませんが、一般的な意味で、これを効率的なプロトコルと呼ぶことはできません。 

投稿が行われると、投稿者のインスタンスから、投稿者をフォローしているすべてのインスタンスにその投稿が送信されます。すると今度はこれらのインスタンスから、スレッドのコンテキストを求めるリクエストが投稿者のインスタンスに送信され、さらに他の投稿に対するリクエストが発生する可能性があります。またフォロワーのインスタンスは、投稿者の現在のプロフィール情報を確認ようとし、検証を行うために rel-me リンクを求めて投稿者のプロフィールのリンクを読み込みます。そしてもちろん、添付ファイルがある場合、それらもダウンロードされます。これらすべてのジョブが Sidekiq キューに作成されますが、Mastodon のデフォルト設定では、このキューには非常に少数のスレッドしかなく、単一プロセスで実行されています。マルチプロセスの Sidekiq が可能であることを示すドキュメントは少なく、Nora Tindall 氏によるブログ記事</u>で初めてこのことを知った方も多いと思います。 

もちろん、これによりオーバーヘッドも増えるので (Sidekiq は目がくらむような大量のメモリを使用します)、すべてをひとつのプロセスで実行でき、より優れた GC を提供する TruffleRuby のソリューションに私は興味があります。

最初のフェデレーションで、行き来するリクエストの大量発生を活発なデータプッシュで置き換えることができれば、役に立つと思います。jort.link</u> というリンク解決の問題に関連する Jortage プロジェクトがあります。

この問題の原因の一部は、Ruby インタプリタで実行されていることに起因しており、「機会があったらやってみたい」プロジェクトのひとつに、GraalVM で TruffleRuby を実装して Mastodon を実行するというものがあります。これにより、JIT コンパイラを使用でき、真のマルチスレッドが可能になるので、Sidekiq にとって大きなメリットになると感じています。グローバルインタプリタロックによって、バニラ Ruby 環境における並列処理が非常に不安定になります (バニラ Python でも同様の問題があり、PyPy にとっては主なメリットのひとつです)。 

Jortage のベースにある一元化は、持続可能性の面ではマイナスになるかもしれませんが、スケールする完全に独立したサービスを運用するとなると、膨大なコストがかかります。

Hannah : インスタンスをセットアップしたい他の開発者に何かアドバイスがありますか?

Thompson 氏 : じっくり時間をかけて考えるようにしてください。インスタンスを運営するということは、コミュニティをセットアップするということです。そして、コミュニティの運営は長期的な (本質的に果てしない) コミットメントを必要とし、適切にコンテンツを検閲するのは非常に困難です。私はプライベートインスタンスをひとつ運営していますが、パブリックインスタンスを運営することの意味を理解しないまま実行に移した人たちの経験談がそこら中に溢れています。

Jortage の詳細に興味がある方や、Thompson 氏と連絡を取りたい方は、Jortage のホームページ</u>にアクセスするか、Fediverse</u> で声をかけてください。