Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

(備忘録) discord.jsでシャーディング

discord.jsのシャーディングの仕組みがイマイチ分かりにくかったので、自身の備忘録も兼ねてまとめたいと思う。
ちなみに、公式のガイドのほうの解説はこちらにある。

シャーディングの方法

discord.jsではShardingManagerを用いてシャードを一元管理できる。

シャーディング用のソースコード上でShardingManagerのインスタンスを作成。
その際、BOT本体が記述されているソースコードファイルを指定することで、それを元に各シャードを初期化できる。
注意しなければならないのは、そのBOT本体が記述されているソースコード単体で実行しても動作するように設計しておかなければならないということだ。

公式ガイドではShardingManagerのインスタンスを作成する際にBOTのトークンを渡しているが、あらかじめ環境変数にDISCORD_TOKENとしてトークンを登録しておけば、自動的にトークンが渡されるようになっている。

シャーディングの仕組み

discord.jsのShardingManagerでは各シャードを子プロセス(デフォルト)かワーカースレッドとして実行されるようになっている。
この際、BOT本体が記述されたソースコード側で特にシャードIDやシャード数に関する値を指定する必要が無いため、不思議に感じると思う。
これはShardingManagerのインスタンスが作成された際にNode.js側の環境変数(要するにprocess.env)に以下のような値が与えられているからだ。

SHARDING_MANAGER  // シャーディングマネージャを使用していることを示す
SHARDS            // シャードID(何番目のシャードか)
SHARD_COUNT       // シャードの総数
DISCORD_TOKEN     // BOTのトークン(ShardingManagerで改めて指定すると上書きされる)

Clientのインスタンスを作成する際、これらの環境変数が参照されるためBOT本体を記述しているソースコード側ではClientのオプションとしてシャーディング周りの値を指定する必要が無くなっている。
ただし、それ以外のオプション値(partialswsなど)は指定する必要があるので、注意が必要だ。

また、ShardingManagerのインスタンスを作成する際に、totalShardsオプションを与えずとも、spawn()メソッドを実行した時点でtotalShardsプロパティの値が上書きされるため、例えばshardCreateイベント内でtotalShardsプロパティの値を参照したとしても、問題なく値を得られる。

参考リンク

/discord.js/src/sharding/ShardingManager.js#L138
/discord.js/src/sharding/Shard.js#L55
/discord.js/src/client/Client.js#L47

あとがき

走り書きに近い備忘録ゆえに内容は推敲されていませんが、未来の自分を含め、参考になれば幸いです。

GrapeColor
現在はDiscord用のBOTを中心に開発しています。 開発言語はRuby、プラットフォームはHerokuを使用して運用しています。 以前は長らくHSPという言語でWindowsアプリケーションを開発していました。
https://grapecolor.fanbox.cc/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away