コールド状態と再開
コールド状態のプロジェクトを再びアクティブにする流れと、一時的に変わる動作を説明します。
プロジェクトが自動停止した状態でノードのディスク容量が不足すると、プロジェクトのプロセスを終了し、データベースを暗号化してオフサイトに保管します。この状態をコールド状態と呼びます。
再アクティブ化の流れ
コールド状態のプロジェクトに最初のリクエストが来ると、次の順序で再アクティブ化します。
- フロントがそのリクエストに
503 coldを応答し、再アクティブ化を開始します。 - 暗号化して保管しておいたデータベースをノードにダウンロードし、復元します。
- 新しい世代を開き、ワーカープロセスを起動します。
この処理には通常 6〜7 秒かかります。進行中のリクエストには 503 応答とともに、数秒後に再試行するよう案内します。
再アクティブ化直後の一時的な制限
再アクティブ化の直後、状態の同期が行われる間 (最大 3 秒) は、データベースを使用するリクエストが
57P03 runlot_fenced エラーで失敗することがあります。同じ時間帯でも、データベースを使用しない経路 (たとえば /) は 200 応答を返します。フロントが新しいデータベース世代へリクエストを転送し始めた後も、ノードプロセスの状態同期には短い時間がかかることがあります。この間、アプリケーションは応答しますが、データベースへのリクエストだけが一時的に失敗することがあります。
対応方法。 アプリケーションで 57P03 エラーを短い間隔で再試行すれば、この期間に対処できます。
async function withRetry<T>(fn: () => Promise<T>, tries = 4): Promise<T> {
for (let i = 0; ; i++) {
try {
return await fn();
} catch (e) {
const code = (e as { code?: string }).code;
if (code !== "57P03" || i >= tries) throw e;
await new Promise((r) => setTimeout(r, 500 * (i + 1)));
}
}
}この動作は既知の制限事項であり、今後改善する予定です。
どのようなときにコールド状態になりますか
コールド状態に切り替わる基準は、アイドル時間ではなくノードのディスク容量の不足です。ノードに空き容量があれば、数日間使用されなくてもデータはノードにそのまま残ります。この場合は外部ストレージからデータをダウンロードせず、ワーカーだけを再び起動します。