自社サービスで
Durable Functionsを
採用した話
terurou
2020-01-18
terurou
• デンキヤギ代表取締役
• Haxe Foundationの方から来ました
• 去年、hxnodejs(Haxe公式のNode.js extern)の
コミッターになりました
• NGKの実行委員を11年ぐらいやってます
1
デンキヤギ株式会社
2
ここ最近は、
Haxe/JS or Scala.jsでJSを生成する
仕事が売上の7-8割を占めてます
求人情報
3
会社見学で寿司か焼肉を振る舞う制度、
まだ生きてます。
コミュニティ支援やってます
4
yagisan
• 雑務を進める、カイゼンする
• 帳票が主体にある業務システム基盤SaaS
• 開発中(未リリース
この辺から本題に入っていきます
5
yagisanの技術指針
6
カネはない…
カネはないので…
• サーバーレス → Azure Functions
• サービス性質さえ合えば、費用効率は高い
• AWSもGoogleも個人的に好きじゃないので…
• かなりの処理をWebブラウザ側に押し付ける
• SPA、あわよくばPWA
• 帳票出力(すごく重い処理)もWebブラウザ側で
7
郵送代行
• yagisanの特異な提供機能
• 郵送を提供している基盤系SaaSは希少
• 間違って「発送」した際、緊急キャンセルしたい
• 某サービスにならい、20分以内ならキャンセル可能
8
普通に作れば、バッチ処理
• 郵送指示は、とりあえずDBにINSERTしておく
• 指示から20分以内ならキャンセルを受け付ける
• バッチを10分間隔などの短周期で起動し続ける
• キャンセルされていないデータを拾って、郵送
9
しかし、あまりバッチ処理にはしたくない
• バッチが短周期で回る = 空振りが多い
• 空振りでもリソースが必要 → コストがかかる
• Azure Functions : リクエスト数とメモリ使用時間
• Cosmos DB : RU(≒スループット)の上限値
10
11
そこで
Durable Functions!
Durable Functionsとは? - MSDNから抜粋
12
Durable Functions は、
サーバーレス コンピューティング環境で
ステートフル関数を記述できる
Azure Functions の拡張機能です。
13
????
私なりのDurable Functionsの説明
• 簡単に使える分散協調処理基盤
• みんな大好きActorモデルもある!
• Durable Functionsの実例を交えた実装パターンが
MSDNで解説されている
• .NET(C#, F#)の他に、Node.jsでも書ける
• ちなみに弊社はHaxe/JSで…
14
今回使うパターン
• Human interaction パターン
• MSDNの日本語訳では「人による操作」
• SMS認証の実装例がMSDNでは紹介されている
• Twillioを使って、SMSで認証コードを送る
• ユーザーは3回まで入力可能(これが人による操作)
• タイマー時間を迎えたら、認証コードは無効化される
15
Human interaction パターンを応用すると…
• タイマー時間を迎える → 郵送実行
• 人による操作が入る → 郵送キャンセル
• この制御機構があれば、緊急キャンセル機能を備えた
郵送システムが実現できる
16
郵送システムの構成要素
17
Orchestrator
郵送指示
Trigger
キャンセル
TriggerHTTP
HTTP 起動
シグナル
実行
Timer
Event
Listener
郵送
Activity
Orchestratorの実装例 - 19行だけ!
18
Orchestratorの要点 – たった3点
• context.df.createTimer(expiration)
• タイマーの作成
• context.df.waitForExternalEvent("cancel")
• cancelシグナルリスナーの作成
• context.df.Task.any([timerTask, cancelTask])
• タイマーかキャンセルのどちらかが発生するまで待機
19
Durable Functions、つよい
• 僅かなコードで複雑な分散協調処理が書けてしまう
• 分散協調処理の知識がなくても書けてしまう
• 同じことをゼロからやろうとすると、めちゃ大変
• Akka, Kafka, ZooKeeper, …の組み合わせで実装
• クラスタリング, エラー監視, リカバリー,…の環境構築
• 何度か実務経験があるが、基盤構築に数か月はほしい
20
Durable Functionsを使う上での課題
• 完全にベンダーロックインされてしまう
• 厳密なタイマー制御はできない
• 実行遅延が許容できない開発対象には適用できない
• まだ枯れてない
• 特にNode.js実装では、しばしばバグに遭遇する
• とはいえ、GitHubでIssueを出せば対応してくれる
21
まとめ
• Durable Functions強い
• 簡単 vs ベンダーロックイン
• まだ枯れてないが、ちゃんと伝えれば直してくれる
• 郵送システムの細かいところは端折った
• エラー監視や復旧操作など
• Singleton orchestratorsも使っている
• Webブラウザ上で動く帳票出力エンジン
22

自社サービスでDurable Functionsを採用した話