본문 바로가기

DevOps/AWS

[Lambda] Lambda로 Kafka 컨슈머 운영할 때 주의할 점

카프카(AWS MSK)를 트리거로 돌리는 람다가 있다. 작년 8월부터 9개월을 운영했다.

이벤트 처리 누락으로 CS가 들어왔던 건 한 두건 있었던 것 같다.

(다른 팀에서 운영하는 람다에서도 종종 이벤트 누락이 발생한다고 하고,, 대응할 수 있는 방안이 있어서 람다 버그구나 생각하고 넘어갔다,,,)

 

내용 요약

- 람다 이벤트 처리 누락 발생 -> records 첫번째 것만 처리함 -> records for문 돌려 해결

- 그랬더니 중복 컨슘 발생 -> lambda timeout 발생 -> timeout 설정 변경하여 해결

 

이벤트 처리 누락 발견

다른 팀에서 며칠 전부터 위 카프카로 배치성으로 이벤트를 보내기 시작했다고 하는데 90프로 처리가 누락되었다.

kafka partition, offset 로그를 찍어뒀는데 중간중간 막 100개쯤 빵꾸가 나있었다.

 

원인

그제서야 람다 코드를 다시 봤다 너무나도 불길한... [0] 이거 뭐지 진짜

def lambda_handler(event, context):
	process(event['records'][0])

사실 처음 알았다... msk 트리거로 걸려있는 batch size는 기본 설정이 100이고 그래서 람다 event['records']에 100개가 들어올 수 있는 것도 몰랐다...

( 카프카로 요청이 몰리는 상황이 없어서 누락이 많이 발생하지 않았던 것 같다 ,,, )

 

해결

def lambda_handler(event, context):
	print(f"event['records'] count : {len(event['records'])}")
    for record in event['records']:
        process(record)

for문 돌리면 된다.

 

중복 컨슘 발견

며칠 동안 처리 누락된 애들을 다시 처리하기 위해 이벤트를 다시 보냈다.

처리량을 보니 분명 800건 보냈는데 막 3만 건이 넘어가있다.

분명 로그상으로 에러 찍힌 것도 없는데 에러로 인해서 중복 컨슘이 발생하는 것 같았다..

 

원인

에러 로그도 없어서 지피티에게 문의해보니 아래와 같은 람다 결과를 좀 보내달라고 해서 보내줬다.

REPORT RequestId: eff798b7-d11e-4863-90a0-0e6a87d1a88f Duration: 3010.68 ms Billed Duration: 59 ms Memory Size: 512 MB Max Memory Used: 79 MB

 

람다 기본 타임아웃 설정이 3초인데 3초 넘어서 그런 것 같다고 했다!

=> timeout으로 일부만 처리되다가 끊기고 계속 재시도 계속 반복

 

해결

lambda timeout 설정 바꿔주고 혹시 몰라서 memory 설정도 늘려주니 이슈 해결.