APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure Durable Functionsを使ってみた

durable functions

はじめに

こんにちは、ACS事業部の奥山です。Azure FunctionsのDurable Functionsを利用する機会があり、非常によい拡張機能でFunctionsを使ってシステムを構築する際には是非利用したい機能だと思ったのでブログにしておきます。

Durable Functionsとは

例ファンアウト・ファンイン

Functionsで利用できるDurable Functionsとはサーバレス環境でステートフル関数を記述できる拡張機能になります。簡単に言うと「直列・並行処理、ワークフロー制御、補正トランザクション、タイマー処理など複雑になりがちなコーディングがより簡単・安全に実現できる拡張機能」と言えます。Functionsを利用することで、スケーラブルで安全なシステムが簡単に素早く実現できるようになっています。

導入について

公式のドキュメントが十分に整備されているので基本的に公式のクイックスタートなどを動かしながら習得していくのが良いと思います。
Durable Functionsについては現在、C#、Javascript(/Typescript)、Pythonがサポートされています。Functionsはサポートされている機能がプログラミング言語ごとに微妙に違うので注意が必要です。

※今回はJavascriptで動作確認を行いました。

https://docs.microsoft.com/ja-jp/azure/azure-functions/durable/quickstart-js-vscode

基本的な仕組みについて

Durable Functionsでは状態の管理にTaskHub(デフォルトではAzure StorageのQueue, Table)を利用しています。 オーケストレーター関数、アクティビティ関数、クライアント関数、エンティティ関数はそれぞれQueue, Tableを参照し連携しています。

構成を簡単に図にするとこうなります。

TaskHub

  1. クライアント関数はオーケストレーター関数を起動するために、Queueへメッセージを登録します。
  2. オーケストレーター関数はQueueトリガーにより起動され、アクティビティ関数を起動するために、Queue,Tableへメッセージを登録します。
  3. アクティビティ関数はQueueトリガーによって起動され、結果をQueue,Tableへメッセージを登録します。Queueトリガーを通してオーケストレーター関数が再度起動されます。

Durable Functionsの関数について

4つの関数から構成されます。特徴と内容を纏めると以下のようになります。

関数名 特徴・主な内容
オーケストレーター関数 ワークフロー(アクティビティ関数の呼び出し順序)を実装します。
注意点として「ネットワーク呼び出しやGUID/UUIDなどの生成はオーケストレーター関数では行えない」。オーケストレーター関数は決定論的である必要があります。
アクティビティ関数 実際の処理の基本単位。外部連携の為にネットワークの呼び出しを行ったり、データベースへの更新処理などを行います。
エンティティ関数 "持続エンティティ"とよばれ、状態が常にストレージ内に持続的に保存されます。データベースのように値を保存しておいて参照することができる。
Durable Functions 2.0 以降でのみ使用できます。
クライアント関数 関数内からオーケストレーター関数、エンティティ関数を呼び出す。
出力バインディングで"type": "orchestrationClient"が指定されている関数。

6つのアプリケーション パターン

公式ドキュメントで紹介されている 6つのアプリケーション パターン の実装例が非常に役に立ちます。

パターンを簡単に纏めると下記のようになります。

# パターン名 簡単な説明・使いどころ
#1 関数チェーン ワークフローの実現。
使い慣れたプログラミング言語を使って複雑なワークフローも簡単に実装することができます。
#2 ファンアウト/ファンイン 並列処理の実現。
ワークフローと組み合わせてActivity単位で直列・並列を制御します。
#3 非同期 HTTP API トランザクションの状態をクライアントにポーリングさせて実行時間の長い処理を調整するよくあるパターン。
オーケストレーター関数の状態をクエリするWebhook HTTP APIが組み込みサポートされており自分で実装する必要がない。
#4 モニター 柔軟な監視処理
#5 人による操作 別システムやクライアントなどからのイベントを待ち受けるパターン
タイマーを利用したワークフロー
#6 アグリゲーター データの集計
(※entityの利用。データベースの様に集計したデータを保存・参照できます。)

まとめ

今回、Durable Functionsを触ってみて非常に良い機能だとおもいました。アプリケーションを実装していく上で、考慮すべきパターンがおおむね網羅されており、設計時にこれらを組み合わせることで質の高い設計ができると思います。Functions自体がFaaSとして提供されているので基本的な利用方法を習得してしまえば、ビジネスロジックの実装にフォーカスできます。 Durable Functionsはクラウド設計パターンで紹介されている「イベントソーシング パターン」「CQRSパターン」などが採用されておりパフォーマンス、スケーラビリティへの対応もされています。 Azure Functionsを利用して開発をする場合は、ぜひ利用していきたい機能です。

検証につかったソースコード https://github.com/APCt-okuyama/az-func-learn

最後に

私たちは、Azure・AKSを活用したシステムのSIや内製化のお手伝いをさせていただいております。 Azureやコンテナ技術の知見を持つエンジニアが対応いたします。ご相談等ありましたらぜひご連絡ください。