重めなDiscord Botを格安で動かしたい
使用人数は少ないけど重めなDiscord Botをなるべく安く動かすにはどうしたら良いのか
条件
・DB(NoSQL可)が使える
・処理時間制限に引っかからない
・コア部分をコンテナで動かしたい
なんかあったときにスッとサービスを乗り換えられるようにしておきたいのと、Container Appsで使う予定でGoでコードを書いてしまったので
・DWHを使いたい
まじでこれは僕の個人的なあれなんですけどDWHを使ってデータ分析とかしたい。BigQueryに無料枠があるから条件が同じならGCPを使いたい
・応答までが早い
FaaSを使ってWebHooksでInteractionを受信しようにもコールドスタートがあるからInteractionの応答制限である3sを超えてしまい返答できない事があるので、応答までが早いEdge FunctionかWSを常にListenできるサーバーが必要
現在の使用技術と問題点
・Azure Contaienr Apps
App Serviceからリクエストを受けて重ためな処理をする用
・Azure App Service
DiscordからのInteractionを受信してACAにリクエストを飛ばすだけ
・Cosmos DB NoSQL
問題点
・App Serivceの無料枠を使っているから定期的にBotが落ちる
15分に1回リクエストを飛ばすようにGASで設定したけど落ちてることがある
・スペック不足
同時に大量にコマンドが送られたらApp Serviceのスペックが足りずに処理が遅くなる/落ちる。完全試用枠なので仕方ない
検討中リスト
Workers + Cloud Run + D1 or Firestore
Workers を使ってWebHooksでInteractionを受信してCloudRunにそれを投げるシステム
APIリクエストを除いても10ms以内に処理しないと落ちちゃうので時間内に動いてくれるか心配
Cloud Functions + Cloud Run + Firestore
さっきのEdgeFunctionsをCloud RunにしてDBはFirestoreにしてGCPに固めたい。これができたら最強。ただやっぱり応答速度がどうなのかなぁ~...とAzure FunctionsとLambdaはコールドスタートで返答ができないケースがしばしばあったからどうかなぁと
使ってみなきゃわかんない
EdgeFunctionサービス + Container Apps + Cosmos DB
現在動いているApp ServiceをEdgeFunctionに変える。ただ変えるならBigQuery使いたいしGoolgeで固めたいなぁという気持ちが強め
あとさっきも言ったようにEdge Functionには処理速度の問題があるから心配
使えないサービスたち
・Azure Functions
応答速度が足りない
・AWS Lambda
上同
・EC2などのVMサービス
ただ単に無料じゃ動かせない
・Google AppEngine無料枠
App Service同様スペック的な問題がある
とりあえずそれ以外はそのままApp ServiceをCloudflare Workersに載せ替えてみた
一癖あったけどちゃんと動くようになったし、元々30秒かかってた処理も20秒前後で動くようになったし、リクエストが一気に飛んできても時間はかかれど処理落ちしなくなったのでめちゃくちゃ良.....
これなんで落ちないんだろう
Firestoreってどんなもんじゃい!と思って使ってみたらエラー吐かれた
こちらのサイトによるとこういうことらしい
V8エンジンで動いてるからこっちじゃないといけないと思ったけどだめらしい...
node版動くんかな
node版動かない
D1もあるけど、後ろで動いてる鯖でデータ簡単に取れるようにしたいから悩みちゅうーー
RPCとREST APIあるからそれ使ってもいいけど面倒くさいからどうしようかな
とりあえずREST API叩いてデータ取るようにしてみた。Token作るのに苦戦してたけどサービスアカウントの権限の設定ミスってたみたいでアカウント変えたら一発だった
OAuth2のToken作って投げるだけだからすぐ失効するしもし万が一僕の不手際で漏れるようなことが合ってもなんとかなりそう
そのうち記事にしたいねー
FirestoreのAPIを叩く日本語記事があまりにもなさすぎて一生Firebaseのドキュメントとにらめっこしてた
今回使ったのは↑のoauth2トークン どっかにリクエストせずにToken作れるから楽
とりあえずCloudflare WorkersとCloudRun、Firestoreで作ることには成功したー
Cloud Functions版もそのうち作ってみたいけど落ち着いたらかな
ユーザーのデータとかはFirestoreでいいけどデカ目のマッチログを保管したり取り出したりできるようにしたいので、デカ目のDBが必要だけどどうしよう
今のところOCIのFree Tierで25GBのNoSQL DBとDWHが使えるらしいからそれ使ってみたいーーでもとりあえずBotを無料(ほぼ無料)でちゃんと実用的な速度で動くようにできたので目標達成ということで
ちなみに色々いじってたらコールドスタートでも10秒前後でレスポンスできるようになったのでラッキー
コード自体はほとんど変えてないどころか機能追加してるからやっぱりContainer Appsのコールドスタート長すぎる...