Azure Durable Functions に入門してみる

303 Views

November 15, 23

スライド概要

profile-image

name: - いけだしんのすけ work: - インフラ・情シス like: - バイク - 読書 - 映画 - アニメ - ゲーム

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Azure Durable Functions に入門してみる☺

2.

#自己紹介 name: いけだしんのすけ like: - バイク 読書 映画 アニメ ゲーム myboom: - アーマードコア6 楽しい - 泣けるアニメを一気見したい work: - インフラ ・ SRE 🐣 - 副業でスタートアップ企業の開発手伝わせてもらってたり - 昔はテレビドラマとか映画のADさんやってた Azure SAE - AWS SAA

3.

Durable (耐久性) Functions (関数) って...?

4.

Durable Functions 概要 Durable Functions は、サーバーレス コンピューティング環境でステートフル関数を記述できる Azure Functions の拡張機能です。 この拡張機能では、Azure Functions プログラミング モデルを使用して、オ ーケストレーター関数を記述することでステートフル ワークフローを定義でき、エンティティ関数を記 述することでステートフル エンティティを定義できます。 拡張機能によって状態、チェックポイント、 再起動がバックグラウンドで管理されるため、ユーザーはビジネス ロジックに専念できます。 https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-overview?tabs=in-process%2Cnodejs-v3%2Cv1-model&pivots=python つまり 1. Azure Functions の拡張機能 2. 関数チェーンや並列処理などを短いコードで書ける

5.

関数チェーン 一連の関数が特定の順序で実行。 各関数間でキューを使用する事でシステムの永続的で スケーラブルな状態を維持。 https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-overview?tabs=in-process%2Cnodejs-v3%2Cv1-model&pivots=python

6.

並列実行 複数の関数を並列で実行し、すべての関数が完了するまで待機。 https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-overview?tabs=in-process%2Cnodejs-v3%2Cv1-model&pivots=python

7.

非同期 HTTP API HTTPエンドポイントを通じて長い処理を開始。 処理が始まると、クライアントは特定のエンド ポイントを定期的にポーリングして、その操作 が終了したかどうかをチェック。 https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-overview?tabs=in-process%2Cnodejs-v3%2Cv1-model&pivots=python

8.

状態監視用のエンドポイント が払い出されるので、アクセ スして状態を監視できる。

9.

Durable Functionsの主な構成 Durable Functions HTTPやタイマーなどで、 オーケストレーションを起動する。 個々の実行する関数。 アクティビティ関数を取りまとめ役。 個々の関数の入力と出力を制御する。 アクティビティ関数1 クライアント関数 オーケストレーター関数 アクティビティ関数2

10.

やってみる Durable Functions 関数チェーンパターン HTTPトリガー オーケストレーター アクティビティ1 アクティビティ2 アクティビティ3

11.

VS Code 拡張で簡単に環境構築できる ■ 環境構築 前提条件 1. 2. 3. 4. 5. VS Code 拡張機能 Azure Tools Azure サブスクリプション Azure ストレージアカウント ローカルで実行するにはAzure Functions Core Toolsが必要 詳細はドキュメントを確認 (以下のリンクはpythonの場合) https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/quickstart-python-vscode?tabs=linux%2Cvs-code-set-indexingflag&pivots=python-mode-decorators

12.
[beta]
コードサンプル (Python - プログラミングモデルV2)
Python
import azure.functions as func
import azure.durable_functions as df

クライアント関数

オーケストレーター関数

myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@myApp.route(route="orchestrators/{functionName}")
@myApp.durable_client_input(client_name="client")
async def http_start(req: func.HttpRequest, client):
function_name = req.route_params.get('functionName')
instance_id = await client.start_new(function_name)
response = client.create_check_status_response(req, instance_id)
return response

@myApp.orchestration_trigger(context_name="context")
def hello_orchestrator(context):
result1 = yield context.call_activity("hello", "Seattle")
result2 = yield context.call_activity("hello", "Tokyo")
result3 = yield context.call_activity("hello", "London")

アクティビティ関数

return [result1, result2, result3]

@myApp.activity_trigger(input_name="city")
def hello(city: str):
return "Hello " + city

13.
[beta]
プログラミングモデルの違い (Pythonの場合)
V1の場合は役割がフォルダ毎で分かれていく
イメージ

webhook

__init__.py

__fuction
.json.

orchestator

__init__.py

__fuction
.json.

V2の場合はデコレーターの記述でコントロールできる。

@myApp.route(route="orchestrators/{functionName}")
@myApp.durable_client_input(client_name="client")
async def http_start(req: func.HttpRequest, client):
function_name = req.route_params.get('functionName')
instance_id = await client.start_new(function_name)
response = client.create_check_status_response(req, instance_id)
return response

@myApp.orchestration_trigger(context_name="context")
def hello_orchestrator(context):
result1 = yield context.call_activity("hello", "Seattle")
result2 = yield context.call_activity("hello", "Tokyo")
result3 = yield context.call_activity("hello", "London")
return [result1, result2, result3]

activity

__init__.py

__fuction
.json.

@myApp.activity_trigger(input_name="city")
def hello(city: str):
return "Hello " + city

14.

触れて分かったDurable Functionsの動き オーケストレーション関数 終わったら起 こして 1つめのアクティビティ関数を呼び出す。 非同期処理が実行されるとスリープ状態になる。 @myApp.orchestration_trigger(context_name="context") def hello_orchestrator(context): result1 = yield context.call_activity("hello", "Seattle") ! 終わったよー 履歴を確認 するでー 1つ目のアクティビティ関数が完了すると、再起動。 最初から処理を実行。その際にアクティビティ関数の処理履歴を 確認して、1つ目の処理が完了していたら2つ目のアクティビティ 関数を実行する。 result2 = yield context.call_activity("hello", "Tokyo") result3 = yield context.call_activity("hello", "London") 1つめ完了してるから スキップして2つめか ら実行するでー return [result1, result2, result3] https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-orchestrations?tabs=csharp-inproc

15.

今回、最終的に作ってみたもの 愚痴をつぶやくと、その愚痴から連想されるアイド ル画像と音声を生成してくれるLINEボット🙄 アクティビティ関数 1 Azure Cognitive Serviceで文章から感情分析 ネガティブが検出できたら アクティビティ関数 2 OpenAI DALL E3 画像生成できたら アクティビティ関数 3 OpenAI Text to speech

16.

以前こんなものも (既視感 w ) ネガティブなメッセージだったら、 真逆の答えを返す映画好きなアイドルボット 関数A お勧めの泣けるアニメ 映画教えろ。全く嫌な 気分だぜ。 映画のレビューDB メッセージから類似度の 高い情報をクエリ Vector Search 関数B あなたへのお勧めは プレデターよ☺ メッセージから乖離度の 高い情報をクエリ https://qiita.com/orc_jj/items/eb0dc19d87121f795eff

17.

最後に Durable Functionsで作る前にAWS CDK × Lambda × SQS で同じ事をやっていたので、その際の感想 と比較すると... 「慣れると使いやすい!」という風に感じました😀 以下は、個人的に感じた纏めポイントです。 ● オーケストレーター関数にはタイムアウトの制約がないが、アクティビティ関数は通常のAzure Functions 同様5~10分 (従量課金の場合)の制約がある。 ● DurableFunctionsのリプレイ動作の特徴は最初に抑えておかないと「?」ってなる事もしばしば。 ● Durable Functionsに限った話では無いけど、Visual Studio Code (Visual Studioも) からボタンポチ! でデプロイできるのでこの辺りはやっぱり凄く便利。

18.

参考 ● https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functionsoverview?tabs=in-process%2Cnodejs-v3%2Cv1-model&pivots=python ● https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/quickstart-pythonvscode?tabs=linux%2Cvs-code-set-indexing-flag&pivots=python-mode-decorators ● https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functionsorchestrations?tabs=csharp-inproc ● https://tech-lab.sios.jp/archives/14249

19.

このアイコン好きです ご清聴有難うございました。