taskqueue 実行時に、対象の async function が見つからない旨のエラーが発生し、正常に処理ができなかった。
原因がいくつかあるみたいだが、今確認しているのは以下。(他の状況も見つかれば追記予定)
キューイング中のファイル名名称変更
Taskのキューイングが行われている時に、ファイル名を変更し Deploy すると発生。
どうやら、キューを呼び出したファイル名と実行するべきFunction 名のペアリングをして制御しているようで、
名称変更によりペアが崩れると正しく処理が行われなくなる。
回避方法
- そもそもファイル名を変更しない運用にする。
- 発生してしまった場合、Queueを流しきってから、Deploy をする。
上記はほぼ流用なので、こちらを見た方がよりよい。
Go言語でハマったNつのこと
実行するべきservice が異なっている
前提条件
foo, baa の2つのサービスが存在する。
foo サービスから以下のtask をfoo service 内で呼び出す。
queue.yaml の設定
- name: baa-task
rate: 250/s
bucket_size: 100
max_concurrent_requests: 1500
target: baa
解決案
queue.yaml 側の target に 指定サービスを設定していると、task queue 実行時に明示的にHost設定していても、
queue.yaml の方のtarget 設定が優先的に使用されるため、意図したservice で動作しない。
hostName, _ := appengine.ModuleHostname(ctx, "foo", "", "")
task.Header.Set("Host", hostName)
if _, err = taskqueue.Add(ctx, task, "baa-task"); err == nil {
log.Infof(ctx, "queuing [%s]", queueName)
}
この場合、baa-task に設定されている target: baa
サービス で動作するため、
設定した task内部で プライベート関数 を用いた async 処理が定義されていた場合、delay: no func with key found
エラーが発生する。
解決するためには、 hostname 側の設定を変更しても変わらないため、
queue.yaml 側の設定を直せばOK。
要約
- キューイング中のファイル名変更はしない
- queue.yaml の target はかなりの権限を持ったサービス指定パラメータ。
- ソース内部でHostName 設定を行う場合、 queue.yaml 側の target 設定が行われていないかを確認しておく。
- queue.yaml の定義を流用させたいときは、targetを指定しない方が取り扱いやすいかも。