多分わかりやすいDurable Functions 〜サーバーレスは次のステージへ〜【入門編】

こんにちは、サイオステクノロジー技術部 武井です。今回は、Azureにて提供されているAzure Functionsの拡張機能である「Durable Functions」について、全4回シリーズで、お話させて頂きたいと思います。Durable Functionsはちょっとややこしいので、本ブログでは、ちょっと違った切り口で、Durable Functionsを伝えてまいります。

※全シリーズの記事一覧はこちら

※本記事をベースにGlobal Azure Bootcamp 2019で登壇させて頂きました!!

Screen Shot 2019-05-27 at 15.01.39

Azure界隈では、Durable Functions結構話題になっていると思います。「Durable Functionsいいよね」って言うと、私サーバーレスアーキテクチャの先を行っています的なオーラを醸し出すことができるのですが、じゃぁDurable Functionsってなんなのって聞かれると、今までの私は困ってました。そこで一所懸命、勉強して、なんとか説明に困らない程度までにはなったのかと思い、一筆したためた次第でございます。

ちなみに、Durable Functionsについては、Azure Functionsをご理解頂いていることが前提となりますので、まず、以下のブログをご一読頂き、「いいね!」をするかコメントしてくれることをオススメ致します。

そもそもDurable Functionsってなに?

詳細は、マイクロソフトの以下のサイトに書いてあります。

https://docs.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-overview

どうでしょうか?わかりましたでしょうか?私はわかりませんでした。いえ、この公式マニュアルはDurable Functionsの全てを網羅しており、とても参考になるのですが、いささか革新から入りすぎているせいか、私のような若輩者にとっては、最初でつまずいてしまいました(><)

私と同じような悩みを抱えている人のために、このブログをしたためた次第です。

で、Durable Functionsですが、ものすごい端的に言ってしまうと、Durable Functionsの特徴は以下のとおりです。

Azure Functionsだけで実現しようとすると、ものすごく複雑なコードになってしまうような複雑な処理が、Durable Functionsを使うと、すごく短いコードで簡単に実現できる。しかもサーバーレスで。

たったこれだけです。でも、これだけだと具体性にかけるので、実際にコードを交えて実演してみたいと思います。

Durable Functionsの構成

その前に、まず、Durable Functionsの構成をご説明したいと思います。早くコードが見たいという方もいらっしゃるかと思いますが、もうちょっと退屈なお話にお付き合いくださいませ。

Durable Functionsは、クライアント関数、オーケストレーター関数、アクティビティ関数の3つの関数から構成されます。それぞれの役割は以下のとおりです。

クライアント関数 オーケストレーター関数を起動するための関数です。この関数を起動するトリガーはAzure Functionsで利用する全てものもを利用できます。
オーケストレーター関数 アクティビティ関数を起動するための関数です。アクティビティ関数のオーケストレーター的な役割をします。例えば、アクティビティ関数の結果を受け取って、それを他のアクティビティ関数に渡したりとか、全てのアクティビティ関数の終了を待ってから処理を行うとか、色々な制御ができます。オーケストレーター関数では実際の処理は行いません。あくまで、アクティビティ関数のコントロールです。
アクティビティ関数 実際の処理を行う関数です。

 

上記の動きを図示すると、以下のような感じになります。

Screen Shot 2019-04-06 at 0.57.18

 

例えば、以下のような処理をDurable Functionsで行うことを考えてみます。

URLのクエリパラメーターnumに指定された数字に2を足し、さらにその数字に2をかける処理を実行する。

この場合、クライアント関数、オーケストレーター関数、アクティビティ関数の役割は以下のようになります。

クライアント関数 HTTPトリガーで起動し、クエリパラメーターnumに指定された数字をオーケストレーター関数に渡す。
オーケストレーター関数 クライアント関数から渡された数字を、アクティビティ関数1(後述)の引数に渡して実行し、さらにその結果をアクティビティ関数2(後述)の引数に渡して実行する。
アクティビティ関数 引数に渡された数字に2を足すアクティビティ関数1と、引数に渡された数字に2をかけるアクティビティ関数2の2つの関数から構成される。

 

図にすると、以下のようになります。

Screen Shot 2019-04-07 at 0.53.58

 

Durable Functionsの簡単なサンプルコード

ここまでのご説明で、Durable Functionsの構成はご理解頂けたかと思います。これからは、簡単なサンプルを用いて、Durable Functionsのコーディングの方法をご説明していきたいと思います。

先程例に挙げました以下の要件を実現するコードをご紹介致します。

URLのクエリパラメーターnumに指定された数字に2を足し、さらにその数字に2をかける処理を実行する。

コードは以下になります。使用言語はC#です。

上記のコードの構成をご説明致します。前述したとおり、このサンプルコードは、クライアント関数、オーケストレーター関数、アクティビティ関数の3つから構成されています。

クライアント関数はHTTPトリガーで起動し、クエリパラメーターnumに指定された数字を解析、取得して、オーケストレーター関数に引き渡す役目を持っています。

オーケストレーター関数は、クライアント関数から渡された数字をもとにアクティビティ関数に渡して、アクティビティ関数を起動し、その結果を受け取ります。

アクティビティ関数は、今回の要件を実現するための本質的な処理を実施します。

さらなるコードの詳細については、コード内のコメント文に記載致しましたので、そちらをご参照下さい。

Durable Functionsを実際に動かしてみよう

本章では、先にご紹介したサンプルコードをAzure上で動かすための手順をご説明致します。まず、Visual Studioにてコードを作成し、Visual Studioから直接Azureにアップロードしてみます。

 

以下のURLからVisual Studioのインストーラーをダウンロードして、起動します。

https://visualstudio.microsoft.com/downloads/

 

「Azureの開発」にチェックを入れて、「インストール」をクリックして下さい。

Screen Shot 2019-04-10 at 20.21.57

 

インストールが完了したら、「ファイル」→「新規作成」→「プロジェクト」の順にクリックします。

Screen Shot 2019-04-11 at 19.58.05

 

「Azure Functions」を選択して、「次へ(N)」 をクリックします。

Screen Shot 2019-04-11 at 19.58.21

 

デフォルトで以下のように入力されていると思います。「場所」については環境によって多少違いかもしれません。とにかく、以下のように入力して、「作成(C)」をクリックします。

Screen Shot 2019-04-11 at 19.58.43

 

「なし」を選択して、「OK」をクリックします。

Screen Shot 2019-04-11 at 19.58.59

 

ソリューションエクスプローラーにあるプロジェクトを右クリックして「追加(D)」→「新しいAzure関数…」の順にクリックします。

Screen Shot 2019-04-11 at 19.59.20

 

「Azure関数」を選択して、「追加(A)」をクリックします。

Screen Shot 2019-04-11 at 19.59.33

 

「Durable Functions Orchestration」を選択して「OK」をクリックします。

Screen Shot 2019-04-11 at 19.59.45

 

「ソリューションエクスプローラー」にて「Functions1.cs」をダブルクリックして、既に書いてあるコードは全て削除し、先にご紹介したコードを貼り付けます。

Screen Shot 2019-04-11 at 22.20.14

 

これでAzureにアップロードできる準備は整ったのですが、とりあえずローカルで動かしてみましょう。三角マークが横になったような、緑のボタンを押してみて下さい。

Screen Shot 2019-04-11 at 22.24.00

 

何やら色々出てきました。以下のようにURLが出てきたら、起動は成功です。以下のURLに「num=2」 というクエリパラメーターをつけて、ブラウザからそのURLを叩いてみて下さい。

Screen Shot 2019-04-11 at 20.03.49

 

すると、またごちゃごちゃーと色々表示されます。その中に「result:8」というのが表示されて入ればOKです。2に2を足して2をかけたので、8が正解です。

Screen Shot 2019-04-11 at 20.04.37

 

では、Azureにアップロードしてみましょう。ソリューションエクスプローラーにてプロジェクトを右クリックして、「発行」をクリックします。

Screen Shot 2019-04-11 at 20.23.51

 

「既存のものを選択」を選択して「発行(U)」をクリックします。

Screen Shot 2019-04-11 at 20.24.57

 

「サインイン」をクリックします。

Screen Shot 2019-04-11 at 20.25.22

 

いつもAzureポータルにサインインしているアカウントでサインインします。

Screen Shot 2019-04-11 at 20.37.15

 

「名前(N)」はAzure上でDurable Functionsを一意に識別する任意の名称、サブスクリプション、リソースグループ、ホスティングプラン、Azure Storageは環境に合わせて適切なものを入力して下さい。このあたりはAzure Functionsを作成するとの同じです。最後に「作成(R)」をクリックします。

Screen Shot 2019-04-11 at 20.41.04

 

しばらくするとAzure上に、先程発行したDurable Functionsが出来上がっています。

Screen Shot 2019-04-11 at 22.49.00

 

まとめ

これで入門編は終了です。でも、今回のサンプルですと、あまりDurable Functionsの真骨頂を発揮できているとは言えません。この程度の簡単なものでしたら、Azure Functionsだけでもできてしまいます。とりあえず、今回はDurable Functionsの概要を把握頂くことが目的でしたので、そんな感じになってしまいました。

そこで次回はもっと複雑なユースケースを交えて、Durable Functionsの素晴らしさを体感して頂きたいと思います。乞うご期待。

次回はこちらになります。

多分わかりやすいDurable Functions 〜サーバーレスは次のステージへ〜【実践編】

本シリーズの記事を作成するにあたり、Durable Functionsの開発者であるChris Gillum氏がde:code 2018で講演された以下のセッションの動画を非常に参考にさせて頂きました。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

5人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です