5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Durable Functionsを使ったときにはまったポイント

Posted at

背景

DurableFunctionsを使ってバッチ処理を行う。
GraphAPIからユーザーデータを取得し、データ変換して、DBに登録という処理を実装したい!

ハマったポイント1

アクティビティ関数に複数の引数を渡すにはどうするのか

正直、調べたらすぐ出てきたのでそんなハマってないけど、備忘録として載せておく。
https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-orchestrations?tabs=csharp#passing-multiple-parameters
👆の公式Docの通りなのでここでは何も言及しません。

ハマったポイント2

オーケストレーター関数が何度も呼び出される?

オーケストレーター関数内でブレークポイントは置かないほうがいいことがわかった。
詳細はコチラありました。→https://qiita.com/Watakatsu/items/584eae41f4507862f045
これはDurableのリプレイ動作によるものらしいです。
処理の実行中でも何かしらの障害があったとしても、Activity関数から再度実行できるという素晴らしい機能のようです。

今回の場合、バッチ処理なため実行時間が非常に長いことで
ローカルデバッグ時、ログ出力にすごい時間を食われていたのでそれもハマった要素の1つでした。
オーケストレータ関数で非同期処理が上手くいってるか確認しようとしたため、私は沼にハマりました。

ハマったポイント3

エラーで落ちたキューが再実行しまくってデバッグしづらい

関数から実行されたオーケストレーター関数やアクティビティ関数はキューに送信され、処理が失敗した場合、再実行してくれるなんとも優秀な機能をFunctions君はお持ちのようです。
つまりデバッグ実行→その都度エラーが吐かれる→停止すると、どんどんキューがたまっていきます。
再度実行する前にローカルストレージを削除してあげましょう。

ローカルストレージのクリア方法

おそらくFunctionsデバッグ実行するとストレージエミュレーターを起動というメッセージが出てくると思います。
タスクバーと日付の間にある「<」を押してWindowsマークが出てくると思います(一度でもデバッグ実行するとおそらく出てきます。)
(マウスオーバーで「Compute Emulator is Started. Storage Emulator is Started.」と表示されてると思います。)
そちらのマークで右クリックを押して、「Show Storage Emulator UI」をクリック。

👇を実行することでローカルストレージ内がクリアされます。

AzureStorageEmulator.exe clear

溜まったキューを見る方法

Microsoft Azure Storage Explorerから確認できます。
[ローカルで接続済み]→[ストレージアカウント]→[エミュレーター]から該当するキューが出てくると思います。
そちらからキューを削除することもできるのでお試しください。

ハマったポイント4

Orchestratorコード内でDurableOrchestrationContextAPIを使用する場合以外で、非同期操作を開始していはいけない。
例:Task.Run、Task.Delay、HttpClient.SendAsyncなど

1つ分からないのが非同期操作だめなのに👇のコードは問題なく使用できたのでどういうことかちょっと何言ってるか分からない状態なりました。

await Task.WhenAll(tasks)

非同期操作の開始はWhenAllだと別にしてないってことでいいんでしょうか

ハマったポイント5

Azure FunctionsにデプロイしたがPortal上でなんかエラー出てる

ストレージ関連でエラーが出ることが多いっていう記事を見かけてたので、時間もかからず解決できました。

Microsoft.Azure.WebJobs.Extensions.DurableTask: Task Hub name must be specified in host.json when using slots. Specified name must not equal the default HubName (itsshareddataservicefunction).See documentation on Task Hubs for information on how to set this: https://docs.microsoft.com/azure/azure-functions/durable/durable-functions-task-hubs.

原因は2つありました。

  1. 各slotで異なるTaskHubNameを使う必要がある。参考→https://docs.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-task-hubs?tabs=csharp
  2. StartUp.csでConfigurationをAddSingletonしていた。

使用するTaskHubNameを設定するためのプロパティを作成する。👇を追加した。

host.json
"extensions": {
    "durableTask": {
      "hubName": "%SlotTaskHub%"
    }
  }

Portal上のアプリケーション設定でも各スロットでそれぞれプロパティを追加して設定してあげましょう。

もう1つの原因として、StartUp.csでConfigurationBuilder()したものをAddSingletonしていたというものです。
コチラが見つけるのにちょっと時間かかりましたが、AddSingletonをしないことでエラーは解決しました。
詳細はこれ→https://github.com/Azure/azure-functions-durable-extension/issues/1313

まとめ

以上がハマったポイントでした。
最小構成で実装したときはすんなりできたが、今回はGraphAPIを使用してデータを加工してDBに登録まで行ったのでかなり沼りました。
ただ少しだけDurable Functionsのことが分かったような気はしてます。
使いこなせれば強力なツールだなと触ってみて実感しました。

5
3
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
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?