フォロー

サーキットブレーカーパターンという奴がありまして、MastodonではStopLightというgemが使われています。StopLightっていうのは信号機のことです。

たくさんのサーバ同士が相互に通信しあう仕組みのActivityPubでは、どこかのサーバでエラーが発生すると、そこに繋ごうとしたサーバでエラーが発生することになります。

このエラーに適切に対処できないと、巻き込まれて死んだり、処理が詰まってサーバ全体の動作がおかしくなったりします。

個別のジョブ(例えばある投稿を相手サーバのフォロワーに届ける)は、失敗したら、時間をおいて再試行するようになっています。この仕組みは再試行パターンという奴で、ジョブを捌くsidekiqが担っています。

さて、個別にはそれでいいのですが、全体としては、死んでいるサーバに対するジョブが次々と生成されていきます。

当面は失敗することが予想されている時は、復活しているか時々チェックするぐらいにとどめて、いちいち試さずに最初から再試行送りにした方が効率的です。これを行っているのがStopLigitです。

さて本題。

Mastodonのリレーであるpub-relayは、最初の頃はsidekiqを使っていたのですが、途中でジョブキューを使わない仕組みに変更されました。

リレーは失敗したジョブを再試行しない(即座にあきらめちゃう)ので、sidekiqを使わなくても大丈夫ではあるのですが、このことで、失敗した場合の対応に弱くなっていました。

どこかのサーバが障害を起こしていると、リレーの処理が詰まるのです……。

そこで、サーキットブレーカーを導入しました。

Crystalでは、Rubyでいうところのgemに相当するshardというのがありまして、そこで公開されているcircuit_brakerというshardを利用しています。

Interesting it's written in Crystal.

All Pleroma servers have a built-in relay, eg https://gleasonator.com/relay It makes hosting a bit easier.

@alex Pleroma is easy to understand with the built-in actors available. Mastodon is a bit more complicated.

From the standpoint of implementing relays, the bottleneck is that Pleroma does not do JSON-LD signatures. Everything needs to be delivered via Announce Activity, so there will be a lot of fetching between servers. Signed Objects can be transferred directly, so the load is less.

Makes sense. Fortunately Elixir can handle a lot of HTTP requests. In my experience, a simple `GET /` repeatedly will DoS small Mastodon servers. Same doesn't happen on Pleroma.
ログインして会話に参加
Fedibird

様々な目的に使える、日本の汎用マストドンサーバーです。安定した利用環境と、多数の独自機能を提供しています。