LoginSignup
1
0

More than 5 years have passed since last update.

delay: no func with key found エラーでハマった話

Last updated at Posted at 2018-06-28

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。

要約

  1. キューイング中のファイル名変更はしない
  2. queue.yaml の target はかなりの権限を持ったサービス指定パラメータ。
  3. ソース内部でHostName 設定を行う場合、 queue.yaml 側の target 設定が行われていないかを確認しておく。
  4. queue.yaml の定義を流用させたいときは、targetを指定しない方が取り扱いやすいかも。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0