람다가 다운스트림일때 동시성 스케일링 정책

TL;DR

서비스별로 스케일링 하는 방식이 다 다르다.

시작하며

SQS 에 데이터가 엄청 많을때 람다가 얼마나 빨리 데이터를 처리할 수 있을까?

일하면서 자주 듣는 질문중의 하나다.

람다도 AWS 입장에서는 마이크로 서비스중의 하나일 뿐이기 때문에,

람다를 어떤방식으로 호출할지, 어떤 기준으로 스케일링할지는 람다와 통합된 다른 서비스들에서 결정하게 된다.

따라서 람다와 S3, SQS, SNS 등을 연결할때 람다가 얼마나 많은 이벤트를 처리할 수 있는지는 람다 자체가 아니라 연결된 서비스의 문서를 확인해야한다.

대부분 람다문서1에 잘 나와있지만, 본 글에서는 주요서비스들과 람다를 연결했을때 스케일링이 어떻게 동작하게 되는지 한곳에 정리해본다.

AWS Lambda

먼저 람다 자체의 기본적인 내용만 간단히 짚고 실제 다른 서비스들과의 연결을 살펴보자.

아래 내용을 깊게 들어가면 본 글의 범위를 벗어나기 때문에 관계된 내용만 간단히 다룬다.

호출방식

람다를 호출하는 방식은 2가지가 있다.2

각 호출방식을 알아야 하는 이유는 람다는 호출 방식에 따라 에러처리가 다르기 때문이다.

예를 들어, 동기호출은 로직에러에 대해서 재시도를 하지 않지만 비동기호출의 경우 2번의 재시도를 자동으로 해준다.

본 글에서는 호출방식에 따른 특징을 상세히 다루지는 않고, 각 서비스를 분류할 때 기준으로만 사용한다.

동시성

람다는 API Gateway 와 마찬가지로 토큰버킷 알고리즘을 통해서 요청수를 제한하고 있다.

문서3에 따르면 람다는 이니셜버스트(initial burst) 이후 분당 500씩 동시성이 늘어난다. (분당 filling rate가 500인 토큰버킷4이라고 생각하면 된다.)

버스트 리밋(burst limit)은 어카운트 내의 모든 함수호출에 대한 동시성을 기준으로 계산하기 때문에, 어카운트 내에서 람다를 쓰는 모든 유즈케이스들도 고려해야 한다.

즉, 다른 서비스들에서 람다를 호출할 때 버스트를 고려해야 최대 호출이 가능한 동시성을 정확히 계산할 수 있다. (물론 버스트리밋도 soft limit 이므로 요청을 통해 늘릴 수 있다.)

주요 서비스들이 람다를 스케일링 하는 방법

비동기 호출

EventBridge

Official EventBridge Doc

SNS

Official SNS Doc

S3

Official S3 Doc

동기 호출

SQS

Official SQS Doc

Kinesis Streams

Official Kinesis Docs

DynamoDB Streams

Official DDB Stream Doc

Managed Service Kafka(MSK)

Official MSK Doc

AmazonMQ

Official AmazonMQ Doc

마치며

잘못된 정보가 있다면 댓글로..