BigQuery
BigQuery Remote Functions
> リモート関数の戻り値は変動すると常に想定されるため、リモート関数を呼び出したクエリの結果はキャッシュに保存されません。
> BigQuery からの再試行を最小限に抑えるには、失敗したレスポンスに 408、429、500、503、504 以外の HTTP レスポンス コードを使用し、関数のコード内ですべての例外をキャッチします。それ以外の場合、HTTP サービス フレームワークは、キャッチされない例外に対して自動的に 500 を返します。
やってみる
適当な Cloud Functions を作る
RemoteFunctions のちょうどいい struct ないのかな
ぱっとない
ほう
何個 Calls が来るかよくわからんな
max_batching_rows
一旦指定しないとどうなるのか見てみる
CREATE FUNCTION `pokutuna-playground.gomibako`.REMOTE_LEN(s STRING) RETURNS INT64
REMOTE WITH CONNECTION `pokutuna-playground.asia-northeast1.remote-function-example`
OPTIONS (
endpoint='https://asia-northeast1-pokutuna-playground.cloudfunctions.net/bq-remote-functions'
)
480 行ぐらいなら1回の function 実行で来る
100000行ぐらい渡してみるか
SELECT
*,
`pokutuna-playground.gomibako`.REMOTE_LEN(CAST(num AS STRING)) AS len
FROM UNNEST(GENERATE_ARRAY(1, 100000)) AS num
値はちゃんと入っていそうだけど Functions 側のログがおかしくなるな
fmt で log 書いてるのが悪かろうと log でもだめだなあ
入力まるごとでかい payload で書いているからおかしいのかも
10万行入力して4回ぐらいのリクエストに分かれてやってくる
nil 返したら NULL になる?
なる
関数で並列数制限して外部 API を叩いてみる
まあできた
semaphore で並列数3ぐらい & Cloud Functions の max-instance 1 にする
スケールさせるにはデカくすればいいのだが
max_batching_rows はいいかなあ
BQ --> Functions --*--> API
制御したいのはこっちなので
max_batching_rows はなしで、逆に calls がでかすぎるときにエラー返すようにすればちょっと安全か?