$30 off During Our Annual Pro Sale. View Details »

[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

  2. 三上 悟 Tech Lead at Voicy saicologic Goの開発は2021年〜 PHP =>

    Ruby => Node.js => Python => Go 自己紹介
  3. Go x AWS Lambda

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

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

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

    API Gateway メール送信 HTTP POST Lambda DynamoDB
  7. どんなイベントが受け取るか? https://sendgrid.kke.co.jp/docs/API_Reference/Webhooks/event.html

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

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

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

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

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

  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回リクエスト
  16. None
  17. ランタイム比較のベンチマーク結果 Node.jsよりは良い。Pythonは同等

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

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

  20. SendGrid Client SendGrid SendGrid Webhook API Gateway メール送信 HTTP POST

    Lambda DynamoDB ベンチマークの時と同じ構成
  21. None
  22. None
  23. None
  24. まとめ ・Node.jsに比べれば高パフォーマンス ・50ms or die の世界では使えない ・128MBより256MBのほうが良い傾向 さらにメモリ割り当て別で見たい場合は AWS公式で紹介されている「 aws-lambda-power-tuning」

    Operating Lambda: パフォーマンスの最適化 – Part 2 ・コールドスタート対策はLambdaのProvisionedCouncurrencyを設定しだい
  25. 開発の始め方

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

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

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

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

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

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

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

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