パラボラアンテナと星の日記

あることないこと

#serverlesstokyo #2 参加レポート (lambdaを速くする話・Azure functionsのtrial・開発ツールの話が面白かった)

#serverlesstokyo行ってきました

#serverlesstokyo meetupに行ってきました。

先に全体的な感想

というのは冗談ですが、「なんでもかんでもFaaSに任せていこう」という主旨のお話が、どんどん続いていって楽しかったです ⚡

これを見れば発表内容が全部わかるスライド一覧

こちらです --> スライド一覧

スライド抜粋

スライド抜粋1: AWS Lambdaのチューニングの話

この話が今の業務の話に一番近く、内容も身近に感じました。

以下、このスライドの紹介している「Lambdaファンクションを速くする」方法。以下に(自分に関係ありそうなところだけ)抜粋を載せます。


  • コールドスタートを速くする
    • コールドスタートを減らす
      • そもそもコールドスタートを発⽣させない
        • 定常的にリクエストが発⽣するシステムではほとんど発⽣しない
    • Lambdaファンクションに対してPingする
      • 定期的にInvokeを⾏うことでコンテナが破棄されることを回避する
      • 5分間隔程度がオススメ
    • コンピューティングリソースを増やす
      • メモリ設定
      • コンピューティングリソースの割当を増やすことで初期化処理⾃体も速くなる
    • ランタイムを変える
      • JVMの起動は遅い
      • ただし、⼀度温まるとコンパイル⾔語のほうが速い傾向
    • VPCを使わない
      • そもそもLambdaと関係なくENIの⽣成とアタッチ処理は遅い
      • コールドスタートを速くしたいならデータストアはDynamoDBが鉄則
      • DBの問題でどうしてもVPCを利⽤したい場合はDynamoDB Streamsを利⽤した⾮同期反映を検討する *1
    • パッケージサイズを⼩さくする
      • サイズが⼤きくなるとコールドスタート時のコードのロードおよびZipの展開に時間がかかる
      • 不要なコードは減らす
      • 依存関係を減らす
        • 不要なモジュールは含めない
  • ファンクションの実⾏時間を短くする
    • コンピューティングリソースを増やす
      • メモリ設定 *2
    • 各⾔語のベストプラクティスに従う
    • グローバルスコープを有効に使う
      • 初期化コードをハンドラ外に置く *3
        • AWSのクライアントやDBコネクションなど
        • Pythonの場合、辞書型の初期化など
      • ファンクションのコンテナが再利⽤される際、これらも再利⽤される
  • 同時実⾏性をあげる
    • 同時実⾏性の⾼いアーキテクチャにして処理全体のスループットを向上させる
    • 同期でInvokeすると同時実⾏数の制限に引っかかってつまりがちなので⾮同期で Invokeするのがオススメ ⎻ なお、ほとんどのイベントソースからは⾮同期でトリガーされる
    • 1ファンクションの実⾏時間は可能な限り短くすること

「初期化コードをハンドラ外に置く」はサンプルコードがそうなっていることが多いので、自然とそうなっていることは多いと思います。 不要なコードは減らす、ベストプラクティスに従う、は、まぁそうですよね。(^^)

スライド抜粋2: Azure functionの話

MSのFaaSの話。

f:id:hoppie:20170121003648j:plain

これだけたくさんの言語をサポートしてて、rubyがないのが残念でなりません。

f:id:hoppie:20170121003638p:plain

このデモ環境 で試すことができる。

実際動かしてみましたが、結構分かりやすかったです。 操作画面は、AWS Lambdaのやつより、使いやすい印象。

スライド抜粋3: 利用されているフレームワークの話。

オープニング のこの話も面白かった。

f:id:hoppie:20170121003537j:plain

ServerlessFramework、 apexが人気。

会社内でもこの2つを使っていますね。


以上です。

*1:DynamoDBに書き込まれてからRDBMSに非同期で書き込まれる、ようにする。

*2:「メモリ設定」なのであるが、増やすと、比例してCPU割当も増えるとのこと。

*3:「const s3 = new AWS.S3();」みたいなのをハンドラの外に置くという話かな。