この記事は、
の一部です。サーバレス関連の良い発表を理解していくことで、知見を溜めていきたいとかんがえています。
この記事で取り上げるのは、下記のサーバレスデザインパターンに関する発表についてです。
Applied Serverless Design Patterns by Yochay Kiriaty www.youtube.com
メモ
- Function 設計
- Function は1つのことのみやらせること。複数の責務を与えないこと。
- Function はなるべく早く完了するように構築すること。
- Function はステートレスであること
- Function は冪等であること
- Design Pattern
- Pattern #1: Function Chaining
- Function を細かくするということは、Function が他の Function を呼び出していくことになる。
このときの問題として、
- 関数間の関連性が見えなくなる
- エラーハンドリングが難しくなる
- ロールバックをどうするか などが挙げられる。
- そこで、Function が他の Function を呼び出す際は、
コーディネートするサービスを使うことを心がけるべき。
- Azure Logic App
- AWS Step Functions
- 後半の Function ロジックの中で、前半の Function の実施結果をロールバックしたいときは、
エラーハンドリング用の Function を用意することで全体を統制するようにする。・・・★
- これを用意してしまうと、コーディネートをコーディネートサービスに一元化できてないのでは?
- トランザクションがないのでどうするか?
- Function を細かくするということは、Function が他の Function を呼び出していくことになる。
このときの問題として、
- Pattern #2: HTTP Async Response (HTTP 202)
- 非同期なワークフローを構築したい時に、Promise 的な処理をどのように構築するか
- Queue や DB? に前段の状態を挿入する
- 後続の処理については、前段が完了したかをチェックしてから処理を行う
- 非同期なワークフローを構築したい時に、Promise 的な処理をどのように構築するか
- Pattern #3: Fun-Out
- 数千オーダーのメールを送るなどの処理をどのようにスケールさせるか
- シーケンシャルに実施するのではなく、キューに挿入した上で後続の Function が並列に処理を進めるように設計する
- Fun-in についても考える必要がある
- 並列でなにかの処理をしたあとに、それを合流させる処理をどのようにするか
- 後続処理用のステートを管理するキューなりDBなりを用意して、・・・★ 最終処理を行う Function が起動するようにする
- 他にも様々なパターンを GitHub に用意しているので、確認してみてください。
- Pattern #1: Function Chaining
感想/疑問点
ついつい複雑な Function を作ってしまうので、最初の4つの設計指針は改めて心がけたいと感じました。
基本的には、ステートを管理するのは他のサービスにまかせて、Function は疎にしましょうという理解をしたのですが、★の部分である Function が他の Function の結果を意識するような設計になっていたのですが、ここがやや矛盾してしまうのでは?と感じたのですがどうなのでしょうか。。