脂肪の機能は反パターンである


単一の目的機能対脂肪ラムダを使用するかどうかについての議論は今日まで続きます、そして、このポストでは、我々があなたを納得させることを望みます.

脂肪ラムダとは何か
FATラムダは、1つ以上のファイルにグループ関連のコードをまとめたパターンです.このラムダは内部ルーティングを使用して呼び出しイベントに基づいて実行するコードを決定します.
内部ルーティングはハードコード化されるかもしれません:

exports.handler =  async function (event, context) {
    const { path, httpMethod: method  } = event
    if (path === '/apps' && method === 'GET') {
        // get apps
    }
    else if (path === '/apps' && method === 'POST') {
        // create app
    }
    else if (path.startsWith('/apps') && method === 'PUT') {
        // update app
    }
    else if (path.startsWith('/apps') === '/user'
             && method === 'DELETE') {
        // delete app
    }
}
または、それはExpressのようないくつかのミドルウェアを使用することができます

let arc = require('@architect/functions')
let express = require('express')

let app = express()
app.post('/apps', (req, res) => // Add App)
app.get('/apps', (req, res)=> // List Apps)
app.put('/apps/:id', (req, res)=> // Update App)
app.delete('/apps/:id', (req, res)=> // Delete App)

exports.handler = arc.http.express(app)
長所
  • 関連するコードはグループ化されます.
  • イベントハンドラ間でコードを共有します.
  • 短所
  • コールドスタート時間は、ラムダに追加するコードのすべての余分なバイトごとに増加します.
  • つのイベントを扱う方法への変更は、すべてのイベントのハンドラを更新する必要があります.
  • 脂肪の機能はsingle responsibility principle .
  • あなたが機能を変更する必要があるとき、より高い認知負担.
  • ルーティングロジックはハードコード化する必要があります.

  • それで、代わりは何ですか?
    複数の責任を扱う単一の関数を作成する代わりに、多くの関数が1つだけを行う単一の目的関数パターンを持っています.

    // add-app.js
    exports.handler =  async function (event, context) {
        // add app
    }
    // get-app.js
    exports.handler =  async function (event, context) {
        // get apps
    }
    // update-app.js
    exports.handler =  async function (event, context) {
        // update app
    }
    // delete-app.js
    exports.handler =  async function (event, context) {
        // delete app
    }
    
    長所
  • 簡単にコールドスタート時間を減らすために機能を最適化する.
  • より小さいラムダは、テスト可能なコードを書くことをより簡単にします.
  • それは単一の責任原理に従う.
  • 個々のラムダに変更を加えるとき、より低い認知荷重.
  • CloudFormation/APIゲートウェイにルーティングロジックをオフにします.
  • 短所
  • ラムダ間のコードを共有するのは難しい.
  • 複数のラムダを維持するのは面倒です.

  • 脂肪関数対単一目的関数の評価
    FAT関数は、単一の目的関数の上にいくつかの長所を持っています、しかし、私は彼らが彼らの否定を覆しないと主張します.FAT機能の支持者は、グループ化関連コードとイベントハンドラ間のコードを共有することが重要な利点であると言います.しかし、ツールを使用してArchitect or Serverless 多くの機能を管理し、はるかに簡単にコードを共有できます.
    今、短所に.

    コールドスタート
    ラムダ関数は動的にプロビジョニングされる.ラムダを要求すると、次の手順を実行します.
  • ダウンロードコード
  • 新規実行環境を開始する
  • 初期化コードを実行する
  • ハンドラコードを実行する
  • 最初の3つのステップを完了するのにかかる時間は、コールドスタートペナルティを考慮するものです.
    これは私たちに冷たいスタート時間を減らすために引くことができるいくつかのレバーを与えます.第一はラムダに割り当てられたメモリである.

    私たちの調査結果について少し驚くべきことは、あなたのラムダに割り当てられたメモリの量がコールドスタート時間に対して無視できる影響を与えるということです.
    我々が引くことができる他のレバーはコードサイズです.JavaScript関数といくつかの大きなバイナリファイルを持つパッケージを使用してコールドスタート時間を見ていました.これらのバイナリファイルのどれもJavaScript関数から参照されるので、それらは解析/解釈されません.それらは単にパッケージサイズを増やすために含まれます.
    パッケージのダウンロードと解凍はコールドスタート時間には影響しません.

    しかし、実行環境がロードされ、JavaScriptをパースするようにコードの複雑さを増加させると、すぐにコールドスタート時間に影響を与えます.外部の依存関係を含まず、コード初期化フェーズ中に解析されたコードの量を増加させる基本JavaScript関数から開始します.

    脂肪の機能を回避し、単一目的の機能で固執あなたのランムダスを実行するときにコールドスタートのペナルティを制限します.

    更新を減らす
    単一の目的関数に変更を配置するときは、単一のイベント型を処理するコードを更新するだけです.しかし、FAT関数では、複数のイベント型を処理するコードを更新します.これは、関連するコードパスにバグを導入する可能性が高くなります.したがって、あなたの生産環境に影響を与えていないことを確認するために、より多くのテストを行う必要があります.

    単一責任原則

    The single-responsibility principle (SRP) states that every module, class or function in a computer program should have responsibility over a single part of that program's functionality, and it should encapsulate that part. All of that module, class or function's services should be narrowly aligned with that responsibility.


    FAT機能は、SRPに付着しません.上記の例では、我々の脂肪の機能は、作成、更新、読書、および当社のアプリを削除する責任があります.また、我々の脂肪の機能はprinciple of least privilege としては、読み取り、書き込み、データベースからアプリケーションを削除する機能が必要です.

    Find関数を単一の目的関数に分解すると、SRPに従い、それぞれの関数に対して最低レベルのアクセス許可を割り当てることができます.


    認知負担
    FAT機能の支持者は、グループ化関連コードが一緒にコードを維持することの認知的負担を減らすと述べます.
  • 彼らが多数であるので、脂肪機能がどんな責任を持つかについて、外部から正確に言うのは難しいです.対照的に、適切に命名された単一の目的関数get-apps or delete-apps-appID かなり自明です.
  • 彼らの分岐構造のためにFAT機能をデバッグすることはより多くの努力を理解することができました、一方、一つの目的機能は比較的簡単です.FAT関数はバックエンドコードを束ねることによってデバッグをより難しくします.そして、我々が将来のポストで対処するもう一つの反パターンを作ります.一方、単一目的関数は、一般的に、エラーが発生したコード行に正確に示すスタックトレースを生成します.

  • 結論として
    脂肪機能の魅力はすぐに“Serverless”アプリケーションにノードのアプリケーションを変換する魅力的ですが、仕事は停止しません.場合は、現在のモノリシックノードアプリケーションを実行している場合はArchitect Express Migration Helper そして、それを一つの目的関数に分解します.時間をかけて単一の目的関数にアプリを壊すことによって、あなたは最も利益を得るでしょう.