Sfida
Evrella, l'assistente AI per il servizio clienti che sviluppiamo e gestiamo, risponde alle telefonate delle aziende. Una telefonata non è una richiesta web: è un flusso audio dal vivo, nei due sensi, che dura minuti, e ogni scambio concatena trascrizione, risposta AI e sintesi vocale mentre chi chiama aspetta. Il servizio è nato su un unico server in affitto — un solo punto di guasto e un tetto fisso alle chiamate — e doveva reggere 100 chiamate contemporanee fin dal primo giorno, senza pagare capacità inutilizzata e senza interrompere nessuno a metà frase.
Approccio
- Spostato il servizio voce su Amazon ECS con Fargate (ARM64) dietro un Application Load Balancer, con un timeout di inattività di un'ora perché la rete non chiuda mai una chiamata lunga
- Resi stateless tutti i container: il webhook della chiamata in arrivo, il WebSocket audio e la callback di fine chiamata possono arrivare a task diversi, quindi lo stato della chiamata vive in DynamoDB e una scrittura condizionale la assegna una volta sola
- Scalato sulle chiamate in corso, non sulla CPU: ogni task comunica le proprie chiamate attive ogni 30 secondi, e un task che si sta fermando non accetta nuove chiamate e lascia finire quelle in corso
- Mantenuto il serverless dove ha senso: il "cervello" AI resta su Lambda con concorrenza riservata, così un picco di chat web non toglie capacità alla linea telefonica, e il lavoro dopo la chiamata — l'SMS, il resoconto, la revisione di qualità — passa da SQS con una dead-letter queue
- Isolato tramite IAM anziché con impianti di rete: una VPC minima senza NAT gateway, un ruolo di task che firma ogni richiesta al cervello AI, e segreti letti da Secrets Manager — mai inclusi nell'immagine
- Passaggio con una via di ritorno: il vecchio server è rimasto pronto, dietro un TTL DNS di 60 secondi, durante il cambio