O que eu faria:
Para cada arquivo bruto
- Solicitar uma url de upload pré assinado do bucket da aws (ex. /uploads/{userId}/{fileId})
- Fazer o upload DIRETO para a aws do arquivo bruto
- enviar uma notificação para o backend que o upload foi concluído (pode ser agrupado em batch aqui, ex: a cada 25 concluidos enviar uma notificação com as ids dos 25)
- o backend recebe essas ids e coloca e uma fila com RabbitMQ
Worker
- Worker escuta a fila
- Quando receber uma id baixa o arquivo da aws, processa e envia convertido no caminho final
- Se não quiser guardar o bruto apaga o bruto
Pontos de falha
- Upload deu erro (pode retentar o mesmo arquivo)
- Conversão deu erro
Para a primeira eu já avisaria no front
Para a segunda precisa implementar algum tipo de notificação (server sent events ou coloca a lista de arquivos no db mesmo pra consultar depois)
Desafios
- Mostrar o progresso da conversão dos arquivos, já que roda em um processo separado
Porque essa arquitetura?
Se você fizer o upload para o seu servidor, processar e enviar somente o arquivo final a aws vai precisar de um servidor muito forte. O cliente vai precisar esperar converter cada arquivo.
No final o cliente vai esperar: upload + conversao + upload bucket
Se colocar numa fila você pode deixar processando por horas em background e o cliente só espera realmente o upload. A conversão pode acontecer depois