Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
世界一わかりみの深いDurable Functions/wakarimi_durablefunctions
Noriyuki TAKEI
February 03, 2022
Technology
0
1k
世界一わかりみの深いDurable Functions/wakarimi_durablefunctions
Noriyuki TAKEI
February 03, 2022
Tweet
Share
More Decks by Noriyuki TAKEI
See All by Noriyuki TAKEI
クラウドデザインパターンを使ってクールな設計をしよう/jazug12th
noriyukitakei
1
130
アウトプットはいいぞ!!〜人生折り返し地点からの情報発信で学びが楽しくなった話〜/outputisgood
noriyukitakei
0
40
Ignite 振り返り & Azure 更新情報!/igniteakimatsuri
noriyukitakei
0
1.8k
世界一わかりみの深い クラウドネイティブなアプリ開発入門 on Azure 第2回 〜App Serviceでアプリをラクチン実行〜/wakarimiazure002
noriyukitakei
0
120
世界一わかりみの深い クラウドネイティブなアプリ開発入門 on Azure 第1回 〜Azureでクラウドネイティブを実現するには〜/wakarimiazure001
noriyukitakei
0
170
世界一わかりみの深いOAuth入門 / wakarimioauth
noriyukitakei
29
14k
Microsoft Ignite Recap Community Day〜現場で使えるIginiteUpdate〜/ignite-recap
noriyukitakei
0
1.9k
世界一わかりみの深い Docker&コンテナ入門 〜 Dockerのファイルシステムってどうなってるの? 〜/wakarimidocker_filesystem
noriyukitakei
1
430
WSL2、Docker、VSCodeで劇的に改善されるWindows開発環境/wslvscodedocker-techlab
noriyukitakei
0
2.6k
Other Decks in Technology
See All in Technology
テクニカルライターよ概念図を描くのです 〜テクニカルライターのためのイラストテクニック2〜 / cybozu illust technique2
yuki_kondo
13
3.6k
マイクロサービス宣言から8年 振り返りとこれから / Eight Years After the Microservices Declaration A Look Back and A Look Ahead
eisuke
2
120
Deep dive in Reserved Instance ~脳死推奨量購入からの脱却~
kzkmaeda
0
130
キャリアを充実させる『カギ』に!PR TIMES CTO金子達哉から学ぶアウトプット術 / output_method
catatsuy
0
210
創業1年目のスタートアップでAWSコストを抑えるために取り組んでいること / How to Keep AWS Costs Down at a Startup
yuj1osm
0
190
ついに来る!TypeScript5.0の新機能
uhyo
16
8.7k
OCI DevOps 概要 / OCI DevOps overview
oracle4engineer
PRO
0
470
グローバルチームことはじめ / Bootstrapping a global team
tasshi
1
530
UIFlowの2.0がやってきた! / ビジュアルプログラミングIoTLT vol.13
you
0
210
私見「UNIXの考え方」/20230124-kameda-unix-phylosophy
opelab
0
140
エアドロップ for オープンソースプロジェクト
epicsdao
0
120
lt53
98_justdoit
0
110
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
499
110k
Scaling GitHub
holman
453
140k
Thoughts on Productivity
jonyablonski
49
2.7k
Done Done
chrislema
178
14k
Robots, Beer and Maslow
schacon
154
7.3k
A designer walks into a library…
pauljervisheath
198
16k
Optimizing for Happiness
mojombo
365
64k
Mobile First: as difficult as doing things right
swwweet
213
7.8k
Writing Fast Ruby
sferik
613
58k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
24
4.5k
Practical Orchestrator
shlominoach
178
8.9k
Pencils Down: Stop Designing & Start Developing
hursman
114
10k
Transcript
None
BCPVUNF Noriyuki TAKEI Ҫ ٓߦ Information • サイオステクノロジー株式会社 • Microsoft
MVP for Azure Favorites • Azure • Squash • Sweets • Running blog https://tech-lab.sios.jp/ core skill Container、Cloud Native、 Serverless全般 Twitter @noriyukitakei
技術ブログ「SIOS Tech.Lab」 多分わかりやすいDurable Functions https://tech-lab.sios.jp/archives/12991
用語解説 Durable Functionsとは? オーケストレーター関数 アクティビティ関数 アクティビティ関数 アクティビティ関数 アクティビティ関数 アクティビティ関数 アクティビティ関数
Durable Functionsとは? ฏͨ͘ݴ͏ͱɺɺɺ "[VSF'VODUJPOT͚ͩͰ࣮ݱ͠Α͏ ͱ͢Δͱɺͷ͘͢͝ෳࡶͳίʔυʹ ͳͬͯ͠·͏Α͏ͳ ෳࡶͳॲཧ͕ɺ%VSBCMF'VODUJPOTΛ ͏ͱɺ͍͘͢͝ίʔυͰ؆୯ʹ ࣮ݱͰ͖Δɻ ͔͠αʔόʔϨεͰɻ
Azure Functionsとは? サーバーが不要!! before • 仮想マシン作成 • OSインストール • ミドルウェア(Apache
等)インストール • 性能検証 • コーディング after ブラウザ上、もしくは専 ⽤の開発環境でコードを ⼊⼒して保存するだ け︕︕ アプリ開発の⼿間を⼤幅に削減︕︕
Azure Functionsとは? 必要に応じてスケール︕︕ before • 負荷テストツール⽤意 • テストシナリオ作成 • テスト実施
• チューニング • 結果報告書作成 after 特別な設定は不要︕︕負 荷に応じてほぼ無限にス ケール︕︕ 負荷に応じて無限にスケールします。
Azure Functionsとは? 使った分だけ課⾦︕︕ before 仮想マシンの場合、アプリ ケーションが動いてなくて も、仮想マシンが起動して いる時間だけ課⾦が発⽣す る。 after
アプリケーションが動い た時間だけしか課⾦され ないので、仮想マシンと ⽐べて料⾦が抑えられる。 使った分だけ課⾦します。
Azure Functionsでこんなアプリを作ってみたい グループA グループB グループA ユーザーA グループB ユーザーB … Azure
FunctionsでAzure Active Directoryにグループ を作成する。 … 先程作成したグループに Azure Functionsでユーザー を追加する。 グループの追加が全て完了したら・・・
None
Azure Functionsでこんなアプリを作ってみたい グループA グループB グループA ユーザーA グループB ユーザーB … Azure
FunctionsでAzure Active Directoryにグループ を作成する。 … 先程作成したグループに Azure Functionsでユーザー を追加する。 ここが 難しい!! グループの追加が全て完了したら・・・
Durable Functionsが 解決!!
前のAzure Functionsが終わるのを待って、次のAzure Functionsを起動で きる。 並列実⾏しているAzure Functionsが全て終わるのを待ってから、次の Azure Functionsを起動できる。 XX時間内に外部からのイベントがない場合は、別の処理を⾏うなんてこ ともできる。
Durable Functionsでは、こんなことができます!!
© SIOS Technology Inc. All rights Reserved. Durable Functionsの実装パターン 14
nori “Hello” + $x Hello nori $x + “. How
are you?” Hello nori. How are you? sayHello関数 sayHowAreYou関数 関数チェーン 関数チェーンは、特定の順序で関数のシーケンスを実⾏するパターンです。
関数チェーン(実装) const df = require("durable-functions"); module.exports = df.orchestrator(function*(ctx) { const
x = yield ctx.df.callActivity(“sayHello”,”nori”); const y = yield ctx.df.callActivity(“sayHowAreYou”, x); return y; });
ファンアウト/ファンイン ファンアウト/ファンインは、複数の関数を並列に実⾏してすべてが完了するまで待機するパターン です。 favoriteFruits関数 favorite Vegetables関数 apple tomato I like
an tomat and an apple
ファンアウト/ファンイン(実装) const df = require("durable-functions"); module.exports = df.orchestrator(function* (ctx) {
const parallelTasks = []; parallelTasks.push(ctx.df.callActivity("favoriteFruits")); parallelTasks.push(ctx.df.callActivity("favoriteVegetables")); const results = yield ctx.df.Task.all(parallelTasks); ctx.log('I like an ' + results[0] + ' and an ' + results[1]); });
人による操作 ある関数を実⾏してから、⼈による操作(承認⾏為など)などがなされてから初めて次の関数を実⾏し ます。
人による操作(実装) const df = require("durable-functions"); const moment = require('moment'); module.exports
= df.orchestrator(function* (context) { yield context.df.callActivity("gatherCode"); const expiration = moment.utc(context.df.currentUtcDateTime).add(90, 's'); const timeoutTask = context.df.createTimer(expiration.toDate()); const challengeResponseTask = context.df.waitForExternalEvent("Response"); const winner = yield context.df.Task.any([challengeResponseTask, timeoutTask]); if (winner === challengeResponseTask) { // Do Smething } });
© SIOS Technology Inc. All rights Reserved. Durable Functionsの構成 21
オーケストレーター関数を起動するための関数です。この関数 を起動するトリガーはAzure Functionsで利⽤する全てものも を利⽤できます。 クライアント 関数 アクティビティ関数を起動するための関数です。アクティビ ティ関数のオーケストレーター的な役割をします。例えば、ア クティビティ関数の結果を受け取って、それを他のアクティビ ティ関数に渡したりとか、全てのアクティビティ関数の終了を
待ってから処理を⾏うとか、⾊々な制御ができます。オーケス トレーター関数では実際の処理は⾏いません。あくまで、アク ティビティ関数のコントロールです。 オーケストレーター 関数 実際の処理を⾏う関数です。 アクティビティ 関数 Durable Functionsの構成
Durable Functionsの構成
以下の要件のDurable Functionsを考えてみよう!! 「URLのクエリパラメーターnumに指定された数 字に2を⾜し、さらにその数字に2をかける処理を 実⾏する。」という簡単な要件をDurable Functionsで実⾏してみる。
HTTPトリガーで起動し、クエリパラメーターnumに指定され た数字をオーケストレーター関数に渡す。 クライアント 関数 クライアント関数から渡された数字を、アクティビティ関数 1(後述)の引数に渡して実⾏し、さらにその結果をアクティビ ティ関数2(後述)の引数に渡して実⾏する。 オーケストレーター 関数 引数に渡された数字に2を⾜すアクティビティ関数1と、引数に
渡された数字に2をかけるアクティビティ関数2の2つの関数か ら構成される。 アクティビティ 関数 Durable Functionsの構成
Durable Functionsの構成
© SIOS Technology Inc. All rights Reserved. Durable Functionsを動かしてみよう 27
以下のユースケースを想定します。 指定された複数のWebサイトのRSSタグを取得して、「Azure」という タグが含まれる記事の合計件数を算出する。 各WebサイトのRSSタグの取得・合計件数の算出は並列で実⾏する。
「Azure」というタグの抽出対象に利⽤させて 頂くWebサイトは以下の2つです。 サイオステクノロジー技術ブログ 「SIOS Tech.Lab」 Azureの更新情報
Durable Functionsを 使わない場合
必要なもの 集計対象のWebサイトのRSSタグを取得し、「Azure」という単語が含まれ る記事の合計数を算出します。このAzure Functionsは後述するAzure Queue Storageでトリガーされ、その結果は、これまた後述するAzure Table Storageに格納します Azure Functions
先程ご紹介したAzure Functionsは、Azure Queue Storageでトリガーされ ます。そのメッセージが格納されるキューになります。 Azure Queue Storage 先程ご紹介したAzure Functionsは、Webサイトごとの集計結果を、Azure のキーバリューストアであるAzure Table Storageに返します。 Azure Table Storage Azure Queue Storageにメッセージをプッシュしたり、Azure Table Storageに格納された結果を集計したりするアプリケーションです。 C#で書いた アプリ
None
None
None
None
None
Durable Functionsを 使わない場合は 仕組みがマジめんどくさい
Durable Functionsを 使う場合
Azure Queue Storage Azure Table Storage Azure Functions C#で書いた アプリ
オーケストレーター関数で 置き換え アクティビティ関数で 置き換え ✗ ✗ 自分で作る必要 なし(実際は裏で 動いている) 自分で作る必要 なし(実際は裏で 動いている)
必要なもの HTTPトリガーで起動し、オーケストレーター関数を起動します。 クライアント 関数 指定された複数のWebサイトのURLをアクティビティ関数の引数に渡して、 合計数を取得し、それらを全て⾜し合わせる。 オーケストレーター 関数 集計対象のWebサイトのRSSタグを取得し、「Azure」という単語が含まれ る記事の合計数を算出します。
アクティビティ関数
クライント関数 const df = require("durable-functions"); module.exports = async function (context,
req) { const client = df.getClient(context); const instanceId = await client.startNew(req.params.functionName, undefined, req.body); context.log(`Started orchestration with ID = '${instanceId}'.`); return client.createCheckStatusResponse(context.bindingData.req, instanceId); };
オーケストレーター関数 const df = require("durable-functions"); module.exports = df.orchestrator(function* (context) {
const tasks = []; const urls = ["https://tech-lab.sios.jp/feed/", "https://azurecomcdn.azureedge.net/ja-jp/updates/feed/"]; for(let i = 0; i<urls.length; i++){ tasks.push(context.df.callActivity("ActivityCountBlog", urls[i])); } const results = yield context.df.Task.all(tasks); const sum = results.reduce((prev, curr) => prev + curr, 0); context.log("result:" + sum); });
アクティビティ関数 const Parser = require('rss-parser'); module.exports = async function (context,
RSS) { const parser = new Parser(); let cnt = 0; const feed = await parser.parseURL(RSS); feed.items.forEach(function (item) { if (item.content.indexOf('Azure') != -1) cnt++; }); return cnt; };
© SIOS Technology Inc. All rights Reserved. Durable Functionsの構成要素と イベントソーシングについて
44
今回の主要な登場人物 オーケストレーター関数を起動するための関数です。この関数 を起動するトリガーはAzure Functionsで利⽤する全てものも を利⽤できます。 クライアント 関数 アクティビティ関数を起動するための関数です。アクティビ ティ関数のオーケストレーター的な役割をします。例えば、ア クティビティ関数の結果を受け取って、それを他のアクティビ
ティ関数に渡したりとか、全てのアクティビティ関数の終了を 待ってから処理を⾏うとか、⾊々な制御ができます。オーケス トレーター関数では実際の処理は⾏いません。あくまで、アク ティビティ関数のコントロールです。 オーケストレーター 関数 実際の処理を⾏う関数です。 アクティビティ 関数
Durable Functionsの実⾏履歴を記録するAzure Table Storageである。オーケストレーター関数やアクティビティ関 数の実⾏開始終了、出⼒した結果などを逐⼀記録する。 History Table 今回の主要な登場人物 オーケストレーター関数を起動するためのキューであり、オー ケストレーター関数はControl
Queueのキュートリガーで動作 する。 Control Queue アクティビティ関数を起動するためのキューであり、アクティ ビティ関数はWork Item Queueのキュートリガーで動作する。 Work Item Queue
Durable Functionsの半分は イベントソーシングで できています。
イベントソーシング 順番 編集履歴 1 「こんにちは、たけいさん、ごきげん、い かが」と投稿する。 2 「たけいさん」の部分を「やまださん」と 編集する。 3
「ごきげん、いかが」の部分を「ごきげん 、うるわしゅう」と編集する。 4 「ごきげん、うるわしゅう」の部分を削除 する。 アプリケーションの開発手法の一つで、発生 したイベントを逐一記録します。 最新の状態を取得するためには、そのイベン トを順次実行(リプレイ)します。 任意の時点に復元できるというメリットはあ りますが、リプレイの仕組みを作成したり、 リプレイ処理自体に一定の負荷がかかるなど デメリットもあります。 こんにちは、 やまださん ① イベントを逐一記録 していく。 ② 今の投稿の最新の状態を取 得するために、順番に全てのイ ベントを実施する。 ③ これが最新の状態と なる。
イベントソーシング int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2 =
await context.CallActivityAsync<int>("MultiplyBy2", result1); int result3 = await context.CallActivityAsync<int>("Plus2", result2); int result4 = await context.CallActivityAsync<int>("MultiplyBy2", result3); 順番 実行関数 結果 戻り値 1 Plus2 成功 4 2 MultiplyBy2 成功 8 3 Plus2 成功 10 Durable Functionsでは、アクティビティ関数が実行されるごとに、その関数名、結果、戻り値を記録 していきます。
© SIOS Technology Inc. All rights Reserved. Durable Functionsは どのように動いているのか?
50
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 クライアント関数は、オーケス トレーター関数を起動するため に、Control Queueにメッセージ をプッシュします。 Message
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 Message オーケストレーター関数 は、Control Queueのキュ ートリガーにより起動し ます。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 オーケストレーター関数が起動 して、Plus2というアクティビテ ィ関数を実行します。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted アクティビティ関数 オーケストレーター関数はHistory Tableに、オ ーケストレーター関数が起動したことを表す 「ExecutionStarted」と「OrchestratorStarted」 を記録します。前者は最初だけ、後者はリプ レイ開始のたびに記録されます。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted アクティビティ関数 オーケストレーター関数はアクテ ィビティ関数を起動するために Work Item Queueにメッセージを プッシュします。 Message
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted アクティビティ関数 オーケストレーター関数はHistory Tableに、アクテ ィビティ関数の起動予約したことを表す「 TaskScheduled」と、リプレイが終わったことを表 す「OrchestratorCompleted」を記録します。ここで 一旦オーケストレーター関数は終了します。 Message
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted アクティビティ関数 Message アクティビティ関数は、Work Item Queueのキュートリガーにより起動 します。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted TaskCompleted 4 アクティビティ関数 アクティビティ関数はHistory Tableに、タスクが完 了したことを表す「TaskCompleted」を記録します 。また、アクティビティ関数の結果をResultに記録 します。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted TaskCompleted 4 Message アクティビティ関数はオーケスト レーター関数を起動するために Control Queueにメッセージをプッ シュします。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted TaskCompleted 4 Message オーケストレーター関数 は、Control Queueのキュ ートリガーにより起動し ます。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted TaskCompleted 4 OrchestratorStarted アクティビティ関数はHistory Tableに、リプレイが 開始したことを表す「OrchestratorStarted」を記録 します。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted TaskCompleted 4 OrchestratorStarted アクティビティ関数Plus2を起動しようとしますが、History Table には既に実行完了である記録があるため、実行をスキップして Resultに記録されている4という結果だけを返します。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted TaskCompleted 4 OrchestratorStarted アクティビティ関数MultiplyBy2を起 動するために、Work Item Queueに メッセージをプッシュします。 Message
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted TaskCompleted 4 OrchestratorStarted TaskScheduled MultiplyBy2 OrchestratorCompleted オーケストレーター関数はHistory Tableに、アクテ ィビティ関数の起動予約したことを表す「 TaskScheduled」と、リプレイが終わったことを表 す「OrchestratorCompleted」を記録します。ここで 一旦オーケストレーター関数は終了します。 Message
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted TaskCompleted 4 OrchestratorStarted TaskScheduled MultiplyBy2 OrchestratorCompleted Message アクティビティ関数は、Work Item Queueのキュートリガーにより起動 します。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted TaskCompleted 4 OrchestratorStarted TaskScheduled MultiplyBy2 OrchestratorCompleted TaskCompleted 8 アクティビティ関数はHistory Tableに、タスクが完 了したことを表す「TaskCompleted」を記録します 。また、アクティビティ関数の結果をResultに記録 します。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted TaskCompleted 4 OrchestratorStarted TaskScheduled MultiplyBy2 OrchestratorCompleted TaskCompleted 8 Message アクティビティ関数はオーケスト レーター関数を起動するために Control Queueにメッセージをプッ シュします。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted TaskCompleted 4 OrchestratorStarted TaskScheduled MultiplyBy2 OrchestratorCompleted TaskCompleted 8 Message オーケストレーター関数 は、Control Queueのキュ ートリガーにより起動し ます。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted TaskCompleted 4 OrchestratorStarted TaskScheduled MultiplyBy2 OrchestratorCompleted TaskCompleted 8 アクティビティ関数Plus2を起動しようとしますが、History Table には既に実行完了である記録があるため、実行をスキップして Resultに記録されている4という結果だけを返します。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted TaskCompleted 4 OrchestratorStarted TaskScheduled MultiplyBy2 OrchestratorCompleted TaskCompleted 8 アクティビティ関数MultiplyBy2を起動しようとしますが、 History Tableには既に実行完了である記録があるため、実行をス キップしてResultに記録されている8という結果だけを返します 。
オーケストレーター 関数 int result1 = await context.CallActivityAsync<int>("Plus2", num); int result2
= await context.CallActivityAsync<int>("MultiplyBy2", result1); Control Queue クライアント関数 Work Item Queue DurableFunctions HubHistory アクティビティ関数 EventType Name Input Result ExecutionStarted Orchastrator 2 OrchestratorStarted TaskScheduled Plus2 OrchestratorCompleted TaskCompleted 4 OrchestratorStarted TaskScheduled MultiplyBy2 OrchestratorCompleted TaskCompleted 8 ExecutionCompleted オーケストレーター関数は、実行が終了したこと を表す「ExecutionCompleted」を記録し、終わりま す。。。
技術ブログ「SIOS Tech.Lab」 多分わかりやすいDurable Functions https://tech-lab.sios.jp/archives/12991
SIOS Tech.Lab https://tech-lab.sios.jp/ 世界⼀わかりみの深い クラウドネイティブ on Azure https://youtube.com/playlist?list=PLbTt_DSTMYgGLUtZ0ewuBwhTBSZnNE2-w 様々なメティアで情報発信しています!! 技術ブログ
YouTube配信