Mastodonのように、たくさんのユーザーがいて、利用者が同時に使用していることが多く、短い投稿やそれに対する返信、リアクションなどが行われ、タイムラインに次々と新着投稿が流れるようなシステムは、

そのひとつひとつの処理(ジョブ)を実行するワーカーに分割し、必要に応じて順次処理していくことで、ユーザーの操作に素早く応答して結果を返し、たくさんの人が同時に利用してもスムースに流れるように工夫されています。

各サーバーは通常、このワーカーを遅滞なく実行できるだけのハードウェアを準備しているのですが、急激に投稿が増えたり、利用者が増えたりすると、処理能力が追いつかなくなります。(※ いつも処理能力不足のサーバもあります)

ワーカーは、処理が追いつかない場合、順番待ちの列を作って自分の番が来るのを待ちます。

列が長くなってくると、処理が完了するまで5分待つとか、20分待つといった状況になります。

そうすると、タイムラインに流れてくる最新情報が20分前だったり、お気に入りがなかなか反映されない、といったことが起きるわけです。

Mastodonでは :sidekiq: Sidekiqと呼ばれるバックグラウンドジョブ処理システムを使っているので、『Sidekiqが遅延してる』などという言い方をします。

Reply to this note

Please Login to reply.

Discussion

Sidekiqによる、細分化されたワーカーを実行する仕組みは、ジョブの失敗をリカバリーすることに対しても強みを発揮しています。

あるサーバがメンテナンス中で接続できなかった場合、そのサーバに投稿を配送しようとすると失敗します。

このとき、投稿の配送をひとかたまりの処理として一回で実行するようになっていると、その時に繋がらないサーバにはもう配送するチャンスがなく、ダメだったら無視されてしまいます。

Sidekiqを使った仕組みでは、失敗したジョブだけを再実行することができます。

しかも、すぐにやり直しても失敗するので、失敗したら少しずつ間隔をあけていきます。

3時間後につながらなかったら、半日後にもう一回試す、というように、相手側が復旧するかもしれない時間を待つようにつくられています。

これにより、復旧したサーバにも配送が届くようになります。

あまりにも長くつながらなかったら、最後には諦めるようになっています。

連合を柔軟に運用できるようにするための、重要な仕組みです。