Mastodonのように、たくさんのユーザーがいて、利用者が同時に使用していることが多く、短い投稿やそれに対する返信、リアクションなどが行われ、タイムラインに次々と新着投稿が流れるようなシステムは、
そのひとつひとつの処理(ジョブ)を実行するワーカーに分割し、必要に応じて順次処理していくことで、ユーザーの操作に素早く応答して結果を返し、たくさんの人が同時に利用してもスムースに流れるように工夫されています。
各サーバーは通常、このワーカーを遅滞なく実行できるだけのハードウェアを準備しているのですが、急激に投稿が増えたり、利用者が増えたりすると、処理能力が追いつかなくなります。(※ いつも処理能力不足のサーバもあります)
ワーカーは、処理が追いつかない場合、順番待ちの列を作って自分の番が来るのを待ちます。
列が長くなってくると、処理が完了するまで5分待つとか、20分待つといった状況になります。
そうすると、タイムラインに流れてくる最新情報が20分前だったり、お気に入りがなかなか反映されない、といったことが起きるわけです。
Mastodonでは Sidekiqと呼ばれるバックグラウンドジョブ処理システムを使っているので、『Sidekiqが遅延してる』などという言い方をします。
ジョブは短時間で実行できる単位に分割します。
そうしないと、ひとつのジョブが長時間占有しつづけることとなり、効率良く他のジョブを同時実行できなくなります。
また、ある処理を実行しているうちに、他の処理の影響で実行に失敗することも起きます。
たとえば、お気に入りしようとした投稿が、何かの都合でもう削除されているかもしれません。
ひとつのジョブが大きすぎると、こういう状況の変化に対応するのが難しくなります。
--
さて、リモートから誰かの投稿がやってきました。
この投稿者をこのサーバでは100人がフォローしているので、100人のタイムラインに投稿を流さねばなりません。
この時まず、リモートサーバから来たActivityの内容を確認するワーカーを実行します。投稿者Aの新規投稿であると解析されました。
次に、この投稿を各タイムラインに配送するワーカーを実行します。
やることの多いワーカーですが、公開範囲を確認し、公開タイムライン(連合、ハッシュタグなど)に流す処理、フォロワーのホームやリストに流す処理を行います。
このうち、フォロワーは人数が多いので、一人ずつのホームとリストそれぞれで100以上のワーカーに分割して走らせます。
難しいかと思いますが、なんとなくイメージできますでしょうか?