どうも、kenji.mです。
Durable Functionsを触っていきます。
「関数チェーン」を触ってみます。
はじめに「関数チェーン」を触ります。
理由は簡単そうだからです(゚∀゚)b
早速プログラムを!の前に…
簡単な手順としては、
1.新しいプロジェクトを作成で「Azure Functions」を選択
2.新しいAzure Functionsアプリケーションの作成で「なし」を選択
(トリガーを選択するところ)
で、プロジェクトが作成されます。
そろそろプログラムを…
プロジェクトが作成されましたが、アプリケーションの作成で「なし」を選択したので、コードのファイルがありません。なので、関数(Function)を追加します。
1.ソリューションエクスプローラーでプロジェクトを右クリック
2.「追加」から「新しいAzure関数…」を選択
3.「Azure関数」を選択して、プロジェクトに追加するファイル名を設定して「追加(A)」ボタンをクリック
4.「Durable Functionsオーケストレーション」を選択してOKボタンをクリック
追加されたファイルを見てみましょう(=゚ω゚)ノ
私は、プロジェクト名「Azure_DurableFunctions_AppChaining」、ファイル名「AppChaining.cs」にして、以下のようなコードが作成されました。
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
namespace Azure_DurableFunctions_AppChaining
{
public static class AppChaining
{
[FunctionName("AppChaining")]
public static async Task<List<string>> RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
var outputs = new List<string>();
// Replace "hello" with the name of your Durable Activity Function.
outputs.Add(await context.CallActivityAsync<string>("AppChaining_Hello", "Tokyo"));
outputs.Add(await context.CallActivityAsync<string>("AppChaining_Hello", "Seattle"));
outputs.Add(await context.CallActivityAsync<string>("AppChaining_Hello", "London"));
// returns ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
return outputs;
}
[FunctionName("AppChaining_Hello")]
public static string SayHello([ActivityTrigger] string name, ILogger log)
{
log.LogInformation($"Saying hello to {name}.");
return $"Hello {name}!";
}
[FunctionName("AppChaining_HttpStart")]
public static async Task<HttpResponseMessage> HttpStart(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient starter,
ILogger log)
{
// Function input comes from the request content.
string instanceId = await starter.StartNewAsync("AppChaining", null);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
return starter.CreateCheckStatusResponse(req, instanceId);
}
}
}
はい。関数チェーンのプログラムができてました。(=゚ω゚)ノ
おもむろにデバッグ実行しても以下のようにコマンドプロンプトが起動してエラーがないことがわかります。

ではプログラムを見てみましょう。
まず、関数(Fanction)が3つあるのがわかります。

それぞれのFunctionの呼び出し先を見ていくと、以下のような構造になっているのがわかると思います。

この辺りを見ると以下のような区分けに成っていることがわかります。

なんか思っていたのと違う(-_-;)
どうやらチェーンするのはアクティビティ関数の部分のようです orz
ここの図を見たときには、なんか独立したプログラムを上手いこと呼び出して連携しそうにみえたんだけどな・・・どうやら勘違いだったようです。
それを踏まえてもう一度見直してみよう(=゚ω゚)ノ
勘違いしていたことを踏まえてもう一度この辺りを読んでみると、はじめに「オーケストレーター関数を記述することでステートフル ワークフローを定義でき、エンティティ関数を記述することでステートフル エンティティを定義できます。」と書いてあります。ということは、オーケストレーター関数に処理の構造(アクティビティ関数の呼び出し順)を書いて、実処理(計算とかリソースへのアクセスとか)をアクティビティ関数に書くと・・・って普通のプログラミングやないかいΣ(゚Д゚)
Azure Functionsと何が違うのか?
ここにはベースになってるものが違うって書いてあるように見えるんだけど、どうなんだろ? この辺りが違うんだろうか。
もっと勉強したいと思います。