(翻訳)Azure DurableFunctions-サーバーレスステートフルワークフローの開発

***職場での知識共有 AzureDurableFunctions***
先日、テクノロジー部門での会議中に、[フォアフロントコンサルティング](https://www.forefront.se/)の同僚と、技術知識を共有する機会がありました。 私の[お気に入りのAzureクラウドサービス](https://medium.com/@jonah.andersson/a-net-software-developers-top-6-favorite-microsoft-azure-technologies-45f945f72605)の1つであるAzureDurableFunctionsの基本に関する洞察と知識を共有できてうれしく思いました。そして興味深いことに気が付いたのです。

##サーバーレスやAzure Durable Functionsとは​​何ですか？

さて、Azure開発に携わったことがなかったり、またはAzureの技術に精通していない場合は、おそらくこの記事は専門用語が飛び交う怪しい記事にしか見えないでしょう。
しかし、それが「何」であるか、またはアプリケーション開発の問題を解決するのにどのように役立つかについて知りたい場合は、このクラウドサービス（Azureを使用している場合）をチェックする価値があります。

この記事があなたを啓発し、あなたにその基本的な知識を与えることを願っています。
（個人的には、この素晴らしいサーバーレス技術をあなたとシェアしたくてたまらない！）


#サーバーレスとは？
最近、特にクラウド開発の世界では、**サーバーレスコンピューティング**が人気を集め始めています。

>サーバーレスコンピューティング（略してサーバーレス）とは、クラウドプロバイダー（AWS、Azure、またはGoogle Cloud）が動的にリソースを割り当ててコードを実行するという実行モデルのことです。そして、コードを実行するために使用したリソースの量に対してのみ課金します。コードは通常、httpリクエスト、データベースイベント、キューイングサービス、監視アラート、ファイルアップロード、スケジュールされたイベント（cronジョブ）など、さまざまなイベントによってトリガーされるステートレスコンテナ内で実行されます。実行のためにクラウドプロバイダーに送られるコードは、通常、関数の形をしている。そのため、サーバーレスは「Functions as a Service」または「FaaS」と呼ばれることもある。以下は、主要なクラウドプロバイダーが提供しているFaaSである。
AWS:AWS Lambda
マイクロソフトAzure:Azure Functions
Googleクラウド:Cloud Functions
サーバーレスは基盤となるインフラを開発者から抽象化していますが、サーバーは機能の実行に関与しています(ソース元:[Serverless-Stack.com](https://serverless-stack.com/chapters/what-is-serverless.html))

サーバーレスは本当はサーバーがないわけではない。インフラは存在しています。"Serverless "の背後にはサーバーがあります。唯一の大きな違いは、[Microsoft Azure](https://azure.microsoft.com/en-us/)のようなクラウドプロバイダーがそれを代行してくれるので、あなたやあなたの組織、開発チームは、Azure Durable Functionsのクラウドサービスを利用して、ソリューションの解決や創造に集中できるということです。


##Azure Durable Functionsとはいったい何？

**Azure Durable Functions**は、[AzureFunctions](https://docs.microsoft.com/en-us/azure/azure-functions/)の拡張機能です

>Azure Functionsは、より少ないコードを記述し、より少ないインフラストラクチャを維持し、コストを節約できるサーバーレスソリューションです。クラウドインフラストラクチャは、サーバーの展開と保守について心配する代わりに、アプリケーションの実行を維持するために必要なすべての最新のリソースを提供します。最も重要なコードに焦点を合わせ、残りはAzureFunctionsが処理します。

一方、Azure Durable Functionsは、AzureFunctionsの上に構築されています。オープンソースです。これは、特に[サーバーレス環境](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AC%E3%82%B9%E3%83%BB%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)でAzure Functionと一緒にコードからサーバーレスの長時間実行ステートフルワークフローを開発する必要がある場合に、標準のAzureFunctionsが実行できる以上のことを行います。


##AzureDurable関数を使用する主なメリット
- コードによるワークフローの定義と記述
- 実行時間の長いタスクを作成する
- 複数のAzure関数を操作する必要がある
- 人間の対話、監視、集約などを必要とするサーバーレスステートフルワークフローを作成する必要がある場合
- ワークフローのステータスが一貫していることを確認する必要があります
- 開発者の生産性に焦点を当てる
- 自動スケーリング機能
- 使用した分だけ支払います（[Azure Pricing Calculator](https://azure.microsoft.com/en-au/pricing/calculator/)を確認してください）
- 他のクラウドサービスとの統合


##Azure Durable TaskFramework-背後にあるテクノロジー

>舞台裏では、Durable Functions拡張機能は、コードでワークフローを構築するために使用されるGitHubのオープンソースライブラリであるDurable TaskFrameworkの上に構築されています。
AzureFunctionsがAzureWebJobsのサーバーレス進化であるように、DurableFunctionsはDurableTaskFrameworkのサーバーレス進化です。 Microsoftおよびその他の組織は、Durable Task Frameworkを広範囲に使用して、ミッションクリティカルなプロセスを自動化しています。これは、サーバーレスのAzureFunctions環境に自然に適合します。

##Azure DurableFunctionsの主要コンポーネント。

**クライアント関数**は、DurableFunctionsオーケストレーションのインスタンスを作成するためのエントリポイントです。これらは、プロセス全体の開始点です。 Azure Durable Functionsのクライアント関数は、複数のソースからのイベント、キューに投稿されたイベントメッセージ、HTTP要求、またはイベントストリームイベントトリガーなどに応答して実行できます。クライアント関数は、利用可能でサポートされているさまざまなプログラミング言語で記述できます。

以下は、オーケストレーターをキックスタートするHTTPトリガークライアントの例です。

**Orchestrator関数**は、アクションの実行方法を記述します。それは耐久性のある機能の重要な部分です。アクションのワークフローは、実行する順序にする必要があります。オーケストレーションロジックをコードで記述する場合、これらの関数が決定論的であることが重要です。

オーケストレーターの素晴らしい点の1つは、それが眠ることです。
スリープ状態の場合、サービスの料金は発生しません。ステートフルワークフローは、通常のAzureFunctionsでは解決できないいくつかの問題を解決します。
たとえば、機能連鎖パターンの場合、オーケストレーターは現在のアクティビティがタスクを実行している間スリープします。終了すると、オーケストレーターがウェイクアップして次のアクティビティを開始します。

これは、オーケストレーターで単純なワークフローコードがどのように表示されるかの例です。

[DeterministicAPIの詳細]()

**アクティビティ機能**は、永続的な機能オーケストレーションの基本的な作業単位です。アクティビティ機能には、オーケストレーションされているタスクによって実行される実際の作業が含まれます。
エンティティ関数は、永続エンティティと呼ばれる状態の小さな部分を読み取って更新するための操作を定義します。

**エンティティ関数**は、Azure DurableFunctionsに最近追加されたものです。これらの機能は、Durable Functions2.0以降でのみ使用できます。これらは現在、.NETおよびJavaScriptでサポートされています（この日付の時点で、この記事は公開されています）。

>エンティティ関数は、永続エンティティと呼ばれる状態の小さな部分を読み取って更新するための操作を定義します。オーケストレーター関数と同様に、エンティティ関数は特別なトリガータイプであるエンティティトリガーを持つ関数です。オーケストレーター関数とは異なり、エンティティ関数は、制御フローを介して状態を暗黙的に表すのではなく、エンティティの状態を明示的に管理します。エンティティは、それぞれが適度なサイズの状態を持つ多くのエンティティに作業を分散することにより、アプリケーションをスケールアウトする手段を提供します。[エンティティ関数]()の詳細をご覧ください。


##耐久性のある機能パターン
耐久性のある関数には、チェックする価値のあるさまざまなパターンがあります。

- 機能連鎖
- ファンアウト/ファンイン
- 非同期HTTPAPI
- モニター
- 人的交流
詳細については、[Azure DurableFunctionsパターン]()をご覧ください。

##耐久性のある機能を開発するためのベストプラクティス（オーケストレーター）
耐久性のある関数を使用してステートフルワークフローを設計および作成する際には、考慮すべき重要なことがあります。前述のように、オーケストレーターのワークフローは決定論的である必要があります。
オーケストレーター関数でワークフローをコーディングするときは、DOとDONTを確認してください。

##さらなる読書と学習リソース
- Microsoft Azure 関数ドキュメント https://docs.microsoft.com/en-us/azure/azure-functions/
- Microsoft Azure Durable Functionsドキュメント 
 https://docs.microsoft.com/en-us/azure/azure-functions/durable/
- Azureコアツール https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local?tabs=windows%2Ccsharp%2Cbash
- Channel9 on Building Workflows with Durable Task Framework　https://channel9.msdn.com/Shows/On-NET/Building-workflows-with-the-Durable-Task-Framework

この記事が気に入ったら、あなたのメディアでぜひ広めてください！
フィードバックでのご質問も受け付けています。
[Twitterフォロー](https://twitter.com/cjkodare)、私の[LinkedIn](https://www.linkedin.com/in/jonahandersson/)にアクセスしてください





##引用元

If you haven't worked with Azure, it might be hard to understand durable functions right away. I hope that this article will enlighten you and give you the basics — I love sharing this solution with others!!

https://dev.to/jonahandersson/azure-durable-functions-developing-serverless-stateful-workflow-4787