環境
- Rust
- Actix-web 4
- Cloud Run(always on cpu)
背景
以前はCloud Runでは基本的にはバックグラウンドでの非同期処理はできなかった。これはリクエスト処理中のみCPUが割り当てることができるという縛りがあったから。
しかし2021年にアップデートがあり、CPUの常時割り当て を行うことができるようになり、バックグラウンドでの非同期処理ができるようになった。
現職でのサービスでは、Cloud Runをalways on cpuの設定にして、RustのActix-webを載せてAPIとして使用しており、Arbiterでスレッド生成(イベントループ生成)を行い、そのスレッドでバックグラウンドでの処理を実行している。
問題
以下の手順で、問題が発生した。
- あるリクエストを受けると、バックグラウンドでの非同期処理Aが実行される
- 他のリクエストを受け付けた際に、アプリ不具合により、panicが発生した
- バックグラウンドで実行されている非同期処理Aが終わらない(止まっている)
- Cloud Runのログを見ると、以下のようになっていた
- 下記のログ例は明示的にpanicを発生させている
詳細
- ローカルホストで再現を試みたが、この問題は発生しなかった(worker数をいろいろ変えてみて並列実行したりして試してみた)
- Cloud Runのドキュメントにはこの挙動について明確な記載を見つけることができなかった。
- とりあえずactix-webをCloud Runに載せるときは、panicしないほうがよさそうだと思われる
- 処理中の他のリクエストも巻き込んで死ぬ
対応と備考
- とりあえずpanicさせければどうということはない
- どうしてもというならpanicを拾う?
- これ書いてるときに発見。あとで試す
- なにかご存じの方いれば教えてください・・