SnowPro Advanced: Data Engineer 無料問題 3 / 10 ・ 分野1: Data Movement
外部のアプリから Snowflake SQL API で INSERT 文を送っている。ネットワークの切断で応答が返らず、文が実行されたか分からないことがある。送り直しても行が二重に入らないようにしつつ、ふだんの要求の処理に余計な負荷をかけたくない。公式ドキュメントに合う使い方はどれか。
- 最初の要求は UUID の requestId だけで送り、retry=true は同じ requestId で送り直すときにしか付けない
- 同じ requestId で送り直せば、retry=true の指定が無くても Snowflake が実行済みの文を照合する
- どの要求にも最初から requestId と retry=true を付け、送り直しは同じ URL のまま繰り返す
- 最初の要求には requestId を付けず、送り直すときにだけ UUID の requestId と retry=true を付ける
正解と解説を見る
正解: A
正解の理由
SQL API では、最初の要求に requestId を付け、送り直しの要求で同じ requestId と retry=true を指定すると、最初の要求で文が既に正常に実行されていれば、Snowflake はその文を再び実行しない。requestId には UUID を生成して使う。retry=true は、Snowflake が文の履歴を調べて一致する文を探すため処理に負荷が加わるので、送り直しが必要なときだけ付けるよう公式は書いている。
違う選択肢
「どの要求にも最初から requestId と retry=true を付け、送り直しは同じ URL のまま繰り返す」… retry=true は文の履歴から同じ文を探して照合するため、処理に負荷が加わる。公式は、送り直しが要るときだけ付けるよう書いている。
「最初の要求には requestId を付けず、送り直すときにだけ UUID の requestId と retry=true を付ける」… 二重の実行を防ぐには、最初の要求と送り直しに同じ requestId が付いている必要がある。最初の要求に ID が無いと、送り直しと照合できない。
「同じ requestId で送り直せば、retry=true の指定が無くても Snowflake が実行済みの文を照合する」… 公式は、requestId を付けたうえで retry=true も指定する必要があると書いている。ID だけでは送り直しとして扱われない。
関連する設定
サーバーが多くの要求を受けていると HTTP 429 が返ることがある。同時に送る要求は再試行の処理で包むよう公式は勧めている。429 の再試行と、実行の有無が分からないときの retry=true は別の話である。