Global Azure Bootcamp 2018@TokyoのLT資料です https://jazug.connpass.com/event/81865/
Durable Functionsでつくるモバイルアプリのサーバーレスなバックエンドfor 承認フロー2018/4/21 Global Azure Bootcamp 2018@Tokyo
View Slide
自己紹介● 杉田 寿憲○ Toshinori Sugita○ toshi0607○ toshi0607○ toshi0607● Software Engineer@freee○ 好評の Windows 版に続いて急遽リリースを決めた Mac 版アプリの開発に、Xamarin.Mac を採用して大幅な開発効率のアップと機能の標準化を実現。● 最近の様子○ Ruby > JavaScript >>> Go >>>>>> C#● 『Extensive Xamarin』(共著)発売中!
今日のお話● Durable Functionsが面白そうなので調べてみた● Xamarin.FormsとDurable Functionsでサンプルアプリをつくってみた● 触ってみる上で知っておくと捗りそうなポイント
Durable Functionsとは?● Azure Functions(、Azure WebJobs)のステートを管理する拡張機能● コードでワークフロー(チェーン、並列実行、非同期管理などなど)を実装● 役割の異なる3つのバインド(orchestrationClient、orchestrationTrigger、activityTrigger)とAzure Storage(Queue、Table、BLOB)でワークフローを制御※https://docs.microsoft.com/ja-jp/azure/azure-functions/durable-functions-overview
Durable Functionsとは?※https://docs.microsoft.com/ja-jp/azure/azure-functions/durable-functions-sequence
Durable Functionsとは?GAの日も遠くなさそう
AWS(AWS Lambda)では?● AWS Step Functionsがある(Azure Logic Appsぽい?)● Amazonステートメント言語(json形式)でステートマシンを記述● ステートにはLambda、アクティビティ(ワーカースクリプト)、エラー処理、反復処理などを記述し、ワークフローを組み立てる※https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/welcome.html
つくったアプリ● スタンプカードアプリ。ただし、スタンプを押すのにはメールでの承認が必要● クライアントはXamarin.Forms製のモバイルアプリ● バックエンドはDurable Functions製※https://github.com/toshi0607/StampCard
つくったアプリ Backend● Microsoft.NET.Sdk.Functions● Microsoft.Azure.WebJobs.Extensions.DurableTask● Microsoft.Azure.WebJobs.Extensions.SendGrid● Microsoft.Azure.Mobile.Client※https://github.com/toshi0607/StampCard MobileClient● Xamarin.Forms● Syncfusion.SfCalendar.XForms● Microsoft.Azure.Mobile.Client
承認フロー● CalendarDate○ Type: 申請ステータス■ Status: Reviewing、Approved、Rejected○ StampAt: カレンダー1日分の日付
各関数・バインドの役割● オーケストレーションクライアント○ HttpTriggerやQueue Triggerなどで起動○ オーケストレーターを操作(開始、強制終了)○ オーケストレーターの状態(実行中、完了など)をクエリ○ オーケストレーターにイベントを送信● オーケストレーション関数○ OrchestrationTriggerで起動○ Table Strotageを使いながらオーケストレーションの履歴を管理する○ 実行履歴をチェックしながら定期的にループしている○ 様々な制約がある○ 外部イベントで実行の中断(見かけ上)を再開できる● アクティビティ関数○ ActivityTriggerで起動○ 標準仕様に近いFunction※https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/welcome.html
デバッグのポイント● オーケストレーターは定期的に再実行される○ activityやイベント待受のawaitごとに状態をTable Storageに保存○ 次回実行時にactivityが完了していたり、イベントを受信したりしていたら先に進めるオーケストレーターのブレークポイントは条件付きにログの吐き出しは条件付きに
デバッグのポイント● オーケストレーションの履歴はTable Storageに保存される● オーケストレーターのアクティビティ呼び出し、クライアントからの呼び出しはQueue Storageを経由する● ログの保存はAzure Functionに準ずるので、Application Insightsの有効・無効に注意するAzure Storage Emulator(azurite for Mac)とAzure Storage Explorerをフル活用
外部イベントの待ち受け※https://docs.microsoft.com/ja-jp/azure/azure-functions/durable-functions-external-events※https://docs.microsoft.com/ja-jp/azure/azure-functions/durable-functions-timersとはいえ必要な時はタイムアウトも忘れずに(DurableOrchestrationContextのCreateTimer使用)
ふりかえり(Good)● Durable Functionsを使うのは便利で楽しいけど、実現するための仕組みや制約を学ぶことはそれ以上に楽しかった● C#でasync/awaitを書く感覚をもたらしつつ、複雑なアーキテクチャ、ステート・実行環境の制御を隠ぺいしてくれているのは最高にcool● クライアントもセットで作ることでより「人の通常操作内でデータの整合性を保つにはどうすればいいか?」という視点が持てて実感がわいてよかった
ふりかえり(Challenge)● モバイルからも制御が複雑なバックエンドからも同じデータを触るにあたりトランザクションほしいとか思ったらデータ更新のフロー見直した方がよいかも● サンプルなのでクライアントはコードビハインドにもりもり書いてみようと思って書いてみたらそれなりに後悔した● ステータス変更はプッシュ通知やポーリングなどでスタンプリクエストする人の「更新」クリックに頼らないようにしたい
良質な学習リソース● [Advent Calendar 2017 Day1] Durable Functions ことはじめ○ まずはポータルでひととおり動かすのが楽でした○ プレビューかつ日々開発が進んでいるのですでに雰囲気違うかもしれません● Durable Functions の概要 (プレビュー)○ 公式ドキュメントの整備され具合がすごいです○ パターンごとのサンプル実装を動かすのもよかったです● Azure/azure-functions-durable-extension○ OSSなのでコードは読み放題です○ issueへの回答もめちゃくちゃ速かったです● Azure Serverless Computing Cookbook○ 2017年8月発売ながら(申し訳程度に)Durable Functionsにも言及○ FunctionsのHttpTriggerしか触ったことがなかったので一からやる分にはユースケースのイメージがつきやすくよかったです
ご清聴ありがとうございました!Durable Functionsでつくるモバイルアプリのサーバーレスなバックエンドfor 承認フロー