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 Slide

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

    View Slide

  3. Go x AWS Lambda

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. View Slide

  13. View Slide

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

    View Slide

  15. ランタイム比較のベンチマーク
    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 Slide

  16. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  21. View Slide

  22. View Slide

  23. View Slide

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

    View Slide

  25. 開発の始め方

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide