[レポート] SRV373 : イベント駆動による巨大な並列処理を作るためのアーキテクチャ #reinvent

AWS re:Invent 2018 SRV373-R - [REPEAT] Building Massively Parallel Event-Driven Architecturesのセッションレポートです。

イベント駆動によるスケーラブルなデータ処理のためのサーバーレスアプリケーション開発を行う際に利用する、AWSの各種サービスの考慮事項についてについて解説しているセッションです。具体的にはAWS Lambdaを中心にAmazon SQSとAmazon SNSを組み合わせた際のアーキテクチャについて解説しています。また、最後にユーザー事例としてMapbox社での適用事例についての紹介もありました。以下、公式の概要です。

Data and events are the lifeblood of any modern application. By using stateless, loosely coupled microservices communicating through events, developers can build massively scalable systems that can process trillions of requests in seconds. In this talk, we cover design patterns for using Amazon SQS, Amazon SNS, AWS Step Functions, AWS Lambda, and Amazon S3 to build data processing and real-time notification systems with unbounded scale and serverless cost characteristics. We also explore how these approaches apply to practical use cases, such as training machine learning models, media processing, and data cleansing.

動画

スライド

本編

スピーカーは Amit Kulkarni さんで、Principal Product Manager AWS Serverless とのことです。

Agenda

  • Modern Serverless Applicaitons
  • Event Delivery Concepts
  • Event Generation, Routing, and Processing
  • Real World High Scale Serverless Application
  • Warp

Modern Serverless Applicaitons

まずはサーバーレスアプリケーションの基本的なアーキテクチャの紹介です。各種イベントソースからLambdaが実行され、その中で他のサービスと連携します。

Event Delivery Concepts

コンセプトと各フェーズにおけるAWSサービスの紹介です。コンセプトとして以下の3つのフェーズに分けて説明していきます。

  • Event Generation
  • Event Routing
  • Event Processing

次に各フェーズの考慮事項についてです。この後のセッションの中で各フェーズの詳細を説明しますが、このスライドは1枚にまとまっていて便利だと考えます。

Event Generation, Routing, and Processing

Event Generation

まずはイベント生成ということで、Payloadのサイズに応じて直接メッセージに含めるのか、大きい場合はそのポインタのみのせるのかという点から始まり、セキュリティーやエラーの扱いなどの考慮事項が挙げられています。

Event Routing

次にイベントルーティングということで、同期処理の場合と非同期処理の場合に分けて考慮事項が挙げられています。

特に非同期の場合は、Lambdaのエラー時に備えてDead Letter Queueを必ず有効化すること、またメッセージが重複して届くことについて考慮するように説明しています。

次はSQSと連携する際の考慮事項についてです。SQSの場合は複数メッセージをまとめてバッチ処理が可能なため、バッチ処理について重点的に解説していました。

次にSNSと連携する際の考慮事項についてです。SNSの場合は1メッセージづつしか処理できないため、SNSとLambdaの間にSQSを入れてバッチ処理する方法も紹介しています。

Event Processing

最後にイベント処理ということで、まずはTPSとConcurrencyは一致せず、処理時間であるDurationの考慮も必要な点が述べられました。その上でどの程度の同時実行数と見積もるかは、まずはピーク時のTPSと平均処理時間から始めてみてはどうかとのアドバイスがありました。

次にLambdaのFunction単位での同時実行数制御についての解説です。アカウント全体の同時実行数制限がある一方で、各Functionでアカウント全体の同時実行数を消費するため、特定のFunctionの同時実行数を確保する際はそれ以外のFunctionの同時実行数を下げることについて説明していました。

Mapboxの事例紹介

次はReal World High Scale Serverless Applicationということで、Mapboxの事例紹介です。スピーカーはMapboxの Data Engineer である Mick Thompson さんに交代しました。

Mapboxでは1日に10億以上のCloudFrontへのアクセスが存在し、そのログは圧縮していても1月で20TBを超えるそうです。そのログの加工にLambdaを利用しているとのことです。

Lambdaのコードにおけるビジネスロジックの割合は99%とのことで、Lambdaを利用することでビジネスロジックに集中できるという話もありました。

最後に

イベント駆動による巨大な並列処理についてのアーキテクチャ紹介でした。個人的にはこれらのサービスを組み合わせる際の考慮事項がまとまっており、とても分かりやすくてよいセッションだと思いました。これから似たようなアーキテクチャで処理を作る際に参考にされてはいかがでしょうか。