アプリが動くタイミング
このページでは、サーバー側の処理があるアプリの実行方法を説明します。静的サイトの配信には、アプリサーバーの起動は必要ありません。静的な画面と API サーバーを組み合わせるハイブリッド構成では、以下の起動・停止の説明は API サーバーに当てはまります。
Keelson は、アクセスに応じてアプリサーバーを起動し、アクセスがない状態が続くと停止します。次のアクセスがあると、再び起動します。
画面表示や API の処理はリクエストを受けて実行し、リクエストの後に続ける処理はバックグラウンドタスクに投入し、毎日の集計などは Keelson の定期実行ジョブで実行します。アプリが常に起動していることを前提にした処理には対応していません。
Web アプリの起動と停止
Section titled “Web アプリの起動と停止”アプリが停止しているときにリクエストを受けると、Keelson がアプリを起動します。このため、停止後の最初のアクセスでは、通常より応答に時間がかかることがあります。
再起動すると、メモリ上の変数や、アプリの実行中にローカルファイルへ保存したデータは引き継がれません。残しておきたいデータは、Managed SQLite や Files / Media SDK に保存してください。
詳しくはデータベース(Managed SQLite)とファイルとメディアを参照してください。
リクエストに応じて実行する処理
Section titled “リクエストに応じて実行する処理”データの保存や外部 API の呼び出しなど、そのリクエストで必要な処理は、レスポンスを返すまでに完了させてください。
レスポンスを返した後にバックグラウンドで続ける処理は、最後まで実行されることが保証されません。FastAPI の BackgroundTasks や、完了を待たずに開始する非同期処理を使う場合は、処理方法の変更が必要です。短い処理はレスポンスを返す前に await で完了させ、レスポンスの後も続ける必要がある処理はバックグラウンドタスクに投入します。
AI の回答生成など、結果を少しずつ返す処理にはストリーミングを利用できます。ただし、接続が切れた後も処理を続ける仕組みとしては利用できません。
リクエストの後に続ける処理
Section titled “リクエストの後に続ける処理”外部 API の重い呼び出し、PDF や画像の生成、リクエストの時間上限を超える処理などは、keelson.yaml の tasks に宣言し、アプリから SDK で投入します。Keelson は Web アプリとは別の実行環境でタスクのコマンドを 1 回起動し、失敗したときは自動で再試行します。
同じタスクが 2 回以上実行されることがあるため、2 回実行されても壊れないように書いてください。設定方法はバックグラウンドタスクを参照してください。
決まった時刻・間隔で実行する処理
Section titled “決まった時刻・間隔で実行する処理”毎朝のレポート作成や定期的なデータ同期は、keelson.yaml の crons に設定します。Web アプリにアクセスがなくても、設定したスケジュールに従って実行されます。
ジョブは Web アプリとは別の実行環境で起動し、指定したコマンドの処理が終わると終了します。Web アプリと共有するデータは、データベースなどに保存してください。
アプリ内のタイマーやスケジューラで時刻を待つ方法は、アプリの停止中には動作しません。定期的な処理は Keelson の定期実行ジョブに設定してください。
設定方法は定期実行ジョブを参照してください。
処理に合わせた実装方法
Section titled “処理に合わせた実装方法”| やりたいこと | 実装方法 |
|---|---|
| フォームの内容を保存する | リクエスト処理中に保存し、結果を返す |
| AI の回答を順次表示する | リクエスト処理中にストリーミングで返す |
| 毎朝レポートを作成する | 定期実行ジョブに設定する |
| 外部サービスと定期的に同期する | 1 回分の同期処理を定期実行ジョブで実行する |
| 重い処理を受け付けて、レスポンスの後に実行する | バックグラウンドタスクに投入する |
| 受け付けた処理を後でまとめて実行する(待ち時間を許す) | 未処理の内容を DB に保存し、定期実行ジョブで処理する |
DB に保存して後で処理する方法では、次のジョブ実行まで待ち時間が発生します。すぐに開始したい処理にはバックグラウンドタスクを使ってください。どちらの方法でも、処理の重複や失敗に備える必要があります。詳しくはバックグラウンドタスクと定期実行ジョブの設計を参照してください。
Keelson は常駐ワーカーを提供していません。リクエストの後に続ける処理は、バックグラウンドタスクに投入してください。
ブラウザ側の処理
Section titled “ブラウザ側の処理”ここまでの説明は、サーバー側の処理が対象です。ブラウザ側のタイマーや画面の自動更新に、この制約は適用されません。
実行時間の上限
Section titled “実行時間の上限”HTTP リクエスト、バックグラウンドタスク、定期実行ジョブには、それぞれ実行時間の上限があります。長い処理は、上限内に完了する単位に分けてください。
詳細はプランと制限、バックグラウンドタスク、定期実行ジョブを参照してください。