멱등성(Idempotency)
멱등성(Idempotency)
Durable functions는 실행 이름(execution name)을 통해 실행 시작 시 내장 멱등성을 제공해요. 실행 이름을 제공하면 Lambda가 이를 사용해 중복 실행을 막고 호출 요청을 안전하게 재시도할 수 있게 해줘요. 스텝(step)은 기본적으로 최소 한 번(at-least-once) 실행 의미론을 가져요. 재생 중에 SDK는 완료된 스텝을 다시 실행하지 않고 체크포인트된 결과를 반환하지만, 완료 전 발생할 수 있는 재시도를 처리하려면 비즈니스 로직이 멱등적이어야 해요.
참고 Lambda 이벤트 소스 매핑(ESM)은 출시 시점에 멱등성을 지원하지 않아요. 따라서 각 호출(재시도 포함)이 새 durable 실행을 시작해요. 이벤트 소스 매핑으로 멱등 실행을 보장하려면 Powertools for AWS Lambda 같은 것으로 함수 코드에 멱등성 로직을 구현하거나, 일반 Lambda 함수를 프록시(디스패처)로 사용해 멱등성 키(실행 이름 파라미터)로 durable 함수를 호출하세요.
본문
실행 이름(Execution names)
durable 함수를 호출할 때 실행 이름을 제공할 수 있어요. 실행 이름은 멱등성 키로 작동해서, 중복 실행을 만들지 않고 호출 요청을 안전하게 재시도할 수 있게 해줘요. 이름을 제공하지 않으면 Lambda가 고유한 실행 ID를 자동으로 생성해요.
실행 이름은 계정과 리전 안에서 고유해야 해요. 이미 존재하는 실행 이름으로 함수를 호출하면, Lambda 동작은 기존 실행의 상태와 페이로드 일치 여부에 따라 달라져요.
멱등성 동작
다음 표는 실행 이름을 제공하는지, 기존 실행 상태, 페이로드 일치 여부에 따라 Lambda가 호출 요청을 처리하는 방법을 설명해요.
| 시나리오 | 이름 제공? | 기존 실행 상태 | 페이로드 동일? | 동작 |
|---|---|---|---|---|
| 1 | 아니요 | N/A | N/A | 새 실행 시작: Lambda가 고유 실행 ID를 생성하고 새 실행을 시작해요 |
| 2 | 예 | 존재하지 않거나 보존 기간 만료 | N/A | 새 실행 시작: Lambda가 제공된 이름으로 새 실행을 시작해요 |
| 3 | 예 | 실행 중 | 예 | 멱등 시작: Lambda가 중복을 시작하지 않고 기존 실행 정보를 반환해요. 동기식 호출에서는 이는 실행 중인 실행에 재연결(reattach)처럼 작동해요 |
| 4 | 예 | 실행 중 | 아니요 | 오류: 이 이름의 실행이 다른 페이로드로 이미 실행 중이므로 Lambda가 DurableExecutionAlreadyStartedException 오류를 반환해요 |
| 5 | 예 | 종료됨(성공, 실패, 중지, 타임아웃) | 예 | 멱등 시작: Lambda가 새 실행을 시작하지 않고 기존 실행 정보를 반환해요. 종료된 실행의 결과가 반환돼요 |
| 6 | 예 | 종료됨(성공, 실패, 중지, 타임아웃) | 아니요 | 오류: 이 이름의 실행이 다른 페이로드로 이미 완료됐으므로 Lambda가 DurableExecutionAlreadyStartedException 오류를 반환해요 |
참고 시나리오 3과 5는 멱등 동작을 보여줘요. Lambda가 중복을 만들지 않고 기존 실행 정보를 반환해 중복 호출 요청을 안전하게 처리해요.
스텝 멱등성(Step idempotency)
스텝은 기본적으로 최소 한 번(at-least-once) 실행 의미론을 가져요. 함수가 대기(wait), 콜백, 실패 후 재생될 때 SDK는 각 스텝을 체크포인트 로그와 대조해요. 이미 완료된 스텝은 SDK가 스텝 로직을 다시 실행하지 않고 체크포인트된 결과를 반환해요. 하지만 스텝이 완료되기 전에 스텝이 실패하거나 함수가 중단되면 스텝이 여러 번 실행될 수 있어요.
스텝 안의 비즈니스 로직은 잠재적 재시도를 처리하도록 멱등적이어야 해요. 결제나 데이터베이스 쓰기 같은 작업이 스텝을 재시도해도 한 번만 실행되도록 멱등성 키를 사용하세요. 멱등성을 위한 코딩 방법의 자세한 내용은 AWS Durable Execution SDK Developer Guide의 Idempotency and retries를 참고하세요.