見出し画像

Quick Poll開発・運用の紆余曲折

Quick Pollをいつもご利用いただいているユーザーの皆様、こんにちは。
当BOTの開発・運用を行っているGrapeColorと申します。

もう4ヵ月前のことになりますが、1週間ほどBOTの運用を停止させていただいたことがありました。
この記事では、いつまで経っても更新されないBOTの紹介記事執筆の景気づけとして、その経緯などについて簡単に説明させて頂こうという趣旨の記事になっております。

技術的な話も出てくるため、大して面白さは期待できない内容であることをご了承ください。

(※記事中では混同を避けるため、Discordのコミュニティの単位『サーバー』は『ギルド』と呼称しています。)

BOTが開発された当初の話

ご存知の方もそうでない方もいらっしゃると思いますが、当BOTはSimple PollのインスパイアBOTです。
Simple PollはDiscordの日本語を第一言語とするコミュニティで広く使われていましたが、当時以下のような問題点がありました。

● 日本語で使えない
● サーバー絵文字が使えない
● 各パラメータを必ずダブルクォーテーションで囲わなければならない
● 誰がアンケートを作ったのか分からない
● 1人1票などの需要が高い機能がない

以上の点から、これらを改良した当BOTの開発に着手するに至りました。

当時、DiscordのBOTを開発できる言語としては、Ruby程度しか習得していなかったため、Rubyで使えるライブラリであったdiscordrbを使用して開発を行いました。
また、BOTを運用するレンタルサーバとしても、ギルド数が現在ほど増大することを考慮していなかったため、Heroku Free Dyno1基のみで運用しておりました。

しかし、ギルド数が100を超えたあたり(昨年の5月頃)から既に動作がおかしくなり始め、時々オフラインになってしまう現象が起こりました。
この問題はライブラリの開発者の方とも相談しましたが、解決策は見つからずじまい。
エラーの内容を見ると、どうもWebSoketのコードのやり取りに問題がありDiscordとの接続が切断されているようであり、ライブラリ側の問題のようでした。
また、この頃から既にdiscordrbの開発がとん挫しており、将来的に利用し続けることが難しくなりそうであったことから、新たにJavaScriptを習得し、人気の高いライブラリであったdiscord.jsを利用した開発にシフトすることを決めました。

度重なるBOTのダウン

それまではオフラインになるとはいえ、Herokuが24時間に一度BOTを再起動してくれることもあり、大した問題にはなっていませんでした。
ただ、ギルド数が2000に近づくにつれ、とうとうBOTが起動すらしない状態へ陥っていきました。

また、Discordのシステム上、2000ギルド以上に参加しているBOTはシャーディング(一種の分散コンピューティング)を行わなければいけない仕組みとなっていることから、渋々新たにHerokuのDynoをレンタルして、2つのクラウドサーバーで分散して運用することになりました。

結果、とりあえず昨年末まではなんとか持ちこたえることができました。

遅れるdiscord.jsへの開発シフト

クリスマスを迎える頃にはいよいよ4000ギルドを超え、またもやサーバーを増やす必要が出てきました。
discord.jsへシフトした後利用する予定だったOracle Cloud Infrastructure(以後、OCI)のクラウドサーバーを臨時で3つ目のシャードとして割り当て、3つのサーバーで運用し始めました。
さて、JavaScript版Quick Pollといえば、昨年から2回も作り直すも、納得できるものが完成しないままスランプに陥っていました。
しかし、導入ギルドは日々加速度的に増加し、もはや3つのサーバーだけで賄える日数は残されていないのでした。

運用不能状態に陥る

丁度3つ目のサーバーを運用に割り当てた頃、TypeScriptを使った開発にシフトし、納得できない気持ちを我慢しながら3度目か4度目の正直で、現在運用されているQuick Pollの開発に着手します。

そして、開発開始から2ヵ月ほどが過ぎた今年の3月7日、全シャードがDiscordに接続できない状態に陥りました。
このとき初めて知ったのですが、1シャードあたりのギルド数が2500程度を超えると接続が拒否される仕様だったようです。
その日から1週間、Quick Pollは運用できない状態となり、ユーザーの皆さんはアンケートの作成も集計もできなくなってしまいました。

とにかく完成させる!

TypeScriptで開発を進めていたQuick Pollは、BOTが運用不能に陥った時点で実はそれなりに完成していました。
あとは開発コストが少ない、集計機能のみが残っているだけであり、それさえ完成させれば運用に移せる段階でした。
なお、この新バージョン開発時に、カスタムプレフィックス機能の削除、一部コマンドの削除、メンション機能、コマンドの編集機能などを搭載しました。

長期の運用停止はユーザー離れを引き起こすため避けなければならず、1週間の期限を設けて停止する旨をユーザーに告知し、とにかくその日までに運用できる状態に持っていくことを考えながら最後の開発を進めました。

そして1週間後、OCIでの運用を始めるのですが…。

メモリが足りない!

OCIで無料でレンタルできるサーバーは当初、1CPU+1GBメモリ×2でした。
そして1つのサーバーのみレンタルし、いざ運用を始めてみたところ、全くメモリが足りませんでした。
元々1GBのメモリのうち、OSやその他サービスに40%程度のメモリを消費するのですが、なんと導入されているギルドのチャンネルデータだけで残りのメモリを使い果たしてしまったのです。
渋々もう1つサーバーをレンタルし、それぞれ4シャードずつ、合計8シャードでの運用体制とし、ひとまず安定運用にこぎつけます。

救世主A1インスタンス

OCIでは今年5月末から、ARMのCPUベースのA1インスタンスというのもが発表されました。
このインスタンスの最も魅力的な点は4つのCPUと24GBものメモリーを、なんと永年無料で利用できるという点です。

Quick Pollのとにかくメモリを消費する仕様にはうってつけのサーバーで、発表当初から目を付け先月にはサーバーの移行作業を行いました。

画像1

これが移行後、現在のメモリ消費量ですが、既に13000ギルド以上に導入されているにもかかわらず、10%にも満たないメモリ使用量に抑えられています。

こうして今後長期的な運用が見込めるようになりました。

今後の展望

こうして、A1インスタンスでの運用に移った結果、少なくともインフラサイドでの悩みの種はかなり軽減されました。
しかし、今後の課題として、現在のQuick Pollのプログラムには不具合や、設計上の問題点が多くあり、その点を改善していく必要があります。
また、そろそろこのサービスから収益を生み、生活の足しにしたい気持ちもあり、今後既存の機能を制限しない形で有料プランを提供したいと考えています。

最後に

このBOTは、元をただせばSimple Pollに不満を抱いて作ったインスパイアBOTで、あくまで私個人とその周辺のコミュニティにて使用されることを想定したものでした。
しかし昨年5月くらいからは、何がキッカケとなったか、一気に導入ギルドが増え、今では1万を超えるギルドで使用されています。
噂では日本語コミュニティでは一番使われているアンケートBOTとの噂もあり、動機の小ささに比べると随分と大きく評価して頂いている印象を抱きます。
とはいえ、大きく評価されているからこそ運営を長く続けていきたいと思っており、ユーザー目線で分かりやすくて便利な機能を今後も拡充し、安定した運用で、ユーザーの皆さんがいつでも当たり前のように使えるBOTを目指して、今後も開発を進めていきたいと思っています。

最後になりますが、この記事を最後まで読んで頂いたこと、拙いサポート体制ながら不具合報告・質問等で心優しく接して頂いたこと、そしてOFUSEでの寄付にご協力いただいたこと、本当に心から感謝しています。

今後も、どうかお付き合い頂けたらと思います。

この記事が気に入ったらサポートをしてみませんか?