Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[Go Conference 2022 Spring] GoとLambdaを使用した高パフォーマンスでサーバレスな マイクロサービスの開発と運用

[Go Conference 2022 Spring] GoとLambdaを使用した高パフォーマンスでサーバレスな マイクロサービスの開発と運用

Go Conference 2022 Spring 発表資料
https://gocon.jp/2022spring/sessions/a11-s/

Satoru Mikami

April 23, 2022
Tweet

More Decks by Satoru Mikami

Other Decks in Technology

Transcript

  1. GoとLambdaを使用した高パフォーマンスでサーバレスな
    マイクロサービスの開発と運用
    ©tottie / Renée French

    View full-size slide

  2. 三上 悟
    Tech Lead at Voicy
    saicologic
    Goの開発は2021年〜
    PHP => Ruby => Node.js => Python => Go
    自己紹介

    View full-size slide

  3. Go x AWS Lambda

    View full-size slide

  4. ・ユースケース
    ・他のランタイムと違い:ベンチマーク
    ・開発の始め方

    View full-size slide

  5. ユースケース:メール配信の不達調査
    メール送信
    ・メールアドレスによる会員登録、アクティベーション
    ・パスワード再発行
    ・パスワード更新
    さまざまな理由によってメールが届かないという問い合わせがある

    View full-size slide

  6. SendGrid
    メール配信プラットフォーム(SaaS)
    Web APIメール送信する
    Webhookを使ってメールのイベントを受け取れる
    SendGrid Client
    SendGrid
    SendGrid Webhook
    API Gateway
    メール送信
    HTTP POST
    Lambda
    DynamoDB

    View full-size slide

  7. どんなイベントが受け取るか?
    https://sendgrid.kke.co.jp/docs/API_Reference/Webhooks/event.html

    View full-size slide

  8. ・管理画面からイベントデータがダウンロードできない
    ・管理画面から数千件までしか見ることができない
    ・どのメールがどういう理由でエラーになったか見つけるのが大変
    なぜ、Webhookが必要?

    View full-size slide

  9. AWS Lambdaはイベントの発生に応じてプログラムを実行する環境を提供する
    クラウドコンピューティングサービス
    ・AWSを利用している
    ・スパイクする
    ・必要なときだけイベントのログが見たい
    ・常時サーバー不要。コストを抑えたい
    なぜ、AWS Lambdaを選定したのか?

    View full-size slide

  10. なぜ、他のランタイムに比べてGoを使うのか?
    背景
    ・LambdaはメインでNode.jsが使われています。LambdaといえばNode.js
    ・開発のメイン言語は99%がGo言語
    ・Goはランタイムが1.xのみ (重要)
    ・ランタイム比較のベンチマーク結果が良好だった

    View full-size slide

  11. Goはランタイムが1つ

    View full-size slide

  12. Goは高パフォーマンスなのか?

    View full-size slide

  13. ランタイム比較のベンチマーク
    OSSのベンチマークプログラムを試しました
    https://github.com/Aleksandr-Filichkin/aws-lambda-runtimes-performance
    複数のランタイムをサポートしてますが、
    Python3.9/Node.js14.x/Goを選択
    参考にした記事
    https://filia-aleks.medium.com/benchmarking-all-aws-lambda-runtimes-in-2021-cold-start-par
    t-1-e4146fe89385
    ベンチマーク計測には、JMeterを使いました。
    同時10ユーザー 3回リクエスト

    View full-size slide

  14. ランタイム比較のベンチマーク結果
    Node.jsよりは良い。Pythonは同等

    View full-size slide

  15. ランタイム比較のベンチマーク
    128MBより256MBのほうが良い

    View full-size slide

  16. 実際に運用してみた結果

    View full-size slide

  17. SendGrid Client
    SendGrid
    SendGrid Webhook
    API Gateway
    メール送信
    HTTP POST
    Lambda
    DynamoDB
    ベンチマークの時と同じ構成

    View full-size slide

  18. まとめ
    ・Node.jsに比べれば高パフォーマンス
    ・50ms or die の世界では使えない
    ・128MBより256MBのほうが良い傾向
    さらにメモリ割り当て別で見たい場合は AWS公式で紹介されている「 aws-lambda-power-tuning」
    Operating Lambda: パフォーマンスの最適化 – Part 2
    ・コールドスタート対策はLambdaのProvisionedCouncurrencyを設定しだい

    View full-size slide

  19. 開発の始め方

    View full-size slide

  20. 公式ドキュメント:はじめの一歩
    https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-golang.html

    View full-size slide

  21. Github
    https://github.com/aws/aws-lambda-go
    eventsフォルダに豊富にサンプルがあります!

    View full-size slide

  22. API-Gateway x Lambda: 最初の一歩
    aws-lambda-go/events/README_ApiGatewayEvent.md

    View full-size slide

  23. API-Gateway x Lambda
    aws-lambda-go/events/apigw.go でRequest/Responseを知る

    View full-size slide

  24. 他のランタイムと同じ

    View full-size slide

  25. その他:M1 Macを使っている人は注意

    View full-size slide

  26. まとめ
    ・当分、Goはランタイムが1つのためメンテナンスが楽です
    ・他のランタイムに比べてもGoのパフォーマンスは良いです
    ・最初は、AWSの公式ドキュメントを読みましょう
    ・次に、Githubにあるソースコードのサンプルを読みましょう
    ・Request/Responseの構造体を読みましょう

    View full-size slide

  27. ご清聴ありがとうございました

    View full-size slide