System Architecture
Client
↓ gRPC (tonic, mTLS)
API Service (ECS Fargate, 2 tasks)
├── DynamoDB: write task event (EventType=SUBMITTED)
└── SQS FIFO: enqueue task message (dedup on idempotency key)
SQS FIFO Queue
↓ Lambda ESM or Worker poll
Worker Pool (ECS Fargate, 4 tasks)
├── Claim task: DynamoDB conditional update (status PENDING→PROCESSING)
├── Execute task payload
├── DynamoDB: write event (COMPLETED or FAILED)
└── SQS: delete message (explicit ack)
DLQ (SQS)
└── DLQ Processor (Lambda): move to DynamoDB DEAD status, alert