Discordのシャーディング:大規模なボットがサーバーを分割する方法
シャーディングとは、大規模なDiscordボットがサーバーを、シャードと呼ばれる複数のゲートウェイ接続に分けて、どの一つの接続にも多すぎる量を載せないようにする仕組みです。 ボットが2,500のサーバーに入ると、Discordはシャーディングを要求し、各サーバーは必ず一つのシャードに属します。
シャードとは
ボットからDiscordへのライブ接続、つまりゲートウェイは、扱える通信量に限りがあります。ある点を超えると、一つの接続では何千ものサーバーからのイベントに追いつけなくなります。Discordは、ボットが複数の接続を開き、それぞれにどのサーバーを担当するかを伝えられるようにして、この問題を解決しています。各接続がシャードです。
サーバーの割り当て方
サーバーのシャードは、そのギルドのIDから求められます。スノーフレークのタイムスタンプ部分を取り除いた後の値を、シャードの数で割り、余りをとる式です。そのため、シャードの数が変わらない限り、あるサーバーは常に同じシャードに入ります。ダイレクトメッセージは常にシャード0に送られます。
ボットは接続時に、自分のシャード番号とシャードの総数という二つの数字を送ります。Discordはそれに合うサーバーのイベントだけを送ります。
必要になるとき
- サーバー数が2,500未満なら、一つの接続で足ります。
- 2,500のサーバーに達すると、Discordは単一の接続を拒否し、ボットはシャーディングしなければなりません。
- 大規模なボットは、通常その上限より前にシャードを追加し、負荷とメモリを分散します。
シャードは一つのプロセスで動かすこともできますし、別々のマシンで動かすこともできます。後者なら、一つのシャードを再起動しても、他のシャードを止めずに済みます。
あなたにとっての意味
ほとんどは何も変わりません。メンバーには違いが見えません。実際に現れるのは障害のときです。一つのシャードがオフラインになると、そのシャードのサーバーだけがボットを失い、他は動き続けます。他のボットは問題なく動いているのに、あなたのサーバーだけでボットがオフラインなら、それはあなたが変えたことではなく、シャードの問題の兆候かもしれません。
シャーディングはレート制限にも関係します。多くのシャードを一度に起動するのは制限されるため、大規模なボットは、それらをバッチに分けて再起動します。
シャーディングとNoxyr
Noxyrでは、何も設定する必要はありません。ステータスとpingのページで、ボットが応答しているかを確認できます。ボットがオフラインのガイドには、最初に確認すべきことが載っています。自分のアプリで独自の接続を持ちたい場合は、カスタムボットが、あなたの名前でNoxyrの機能を動かします。そのボットがどう稼働し続けるかは、ホスティングのノードと稼働時間の記事で説明しています。
よくある質問
ボットは何サーバーでシャーディングが必要になりますか?
Discordは2,500のサーバーでシャーディングを要求します。多くの大規模なボットは、負荷を分散するために、それより早くシャーディングします。
一つのサーバーが二つのシャードに属することはありますか?
いいえ。サーバーは常に、そのIDとシャードの数から選ばれた、ちょうど一つのシャードに属します。
シャーディングは、メンバーにとって何かを変えますか?
いいえ。内部の詳細です。重要になるのは障害のときだけで、一つのシャードが故障しても他には影響しません。