Este é um serviço desenvolvido em Spring Boot que integra um sistema maior de processamento de arquivos de vídeo. Sua principal responsabilidade é processar vídeos de forma assíncrona, gerando snapshots (capturas de tela) em momentos específicos do vídeo e disponibilizando essas imagens em um arquivo compactado.
- Visão Geral
- Arquitetura
- Tecnologias
- Estrutura do Projeto
- Configuração do Ambiente
- Fluxo de Processamento
- Integração com AWS
- Deployment
O serviço é parte de uma arquitetura orientada a eventos que processa arquivos de vídeo de forma assíncrona. Principais funcionalidades:
- Consumo de eventos de upload de arquivos via Amazon SQS
- Download automático de vídeos do Amazon S3
- Geração de snapshots de vídeos usando JavaCV
- Compactação de snapshots em arquivo ZIP
- Upload do resultado para Amazon S3
- Gerenciamento de estado no Amazon DynamoDB
- Notificação de resultados via Amazon SQS
O projeto segue os princípios da Arquitetura Limpa (Clean Architecture):
-
Domain Layer (
domain/)- Entidades core do negócio
- Enums e exceções
- Regras de negócio independentes
-
Application Layer (
application/)- Casos de uso
- Interfaces (gateways/ports)
- Regras de aplicação
-
Infrastructure Layer (
infrastructure/)- Implementações concretas
- Adaptadores para serviços externos
- Configurações
classDiagram
class ProcessFileUploadUseCase {
+execute(String key)
}
class ProcessFileUploadSpec {
<<interface>>
+execute(String key)
}
class ProcessFileUploadGateway {
+execute(String key)
}
class UploadEventConsumer {
+listen(UploadEventMessage message)
}
class ScreenshotService {
+generate(String fileName)
}
class StorageClientService {
+download(String fileName)
+upload(String fileName, InputStream file, String contentType)
+remove(String fileName)
}
class NotificationEventService {
+notifyError(String id, String message)
+notifySuccess(String id, String status)
}
ProcessFileUploadUseCase ..> ProcessFileUploadSpec
ProcessFileUploadGateway ..|> ProcessFileUploadSpec
UploadEventConsumer --> ProcessFileUploadUseCase
ProcessFileUploadGateway --> ScreenshotService
ProcessFileUploadGateway --> StorageClientService
ProcessFileUploadGateway --> NotificationEventService
sequenceDiagram
participant SQS
participant Consumer as UploadEventConsumer
participant UseCase as ProcessFileUploadUseCase
participant Gateway as ProcessFileUploadGateway
participant S3
participant Screenshot as ScreenshotService
participant DynamoDB
participant Notification as NotificationEventService
SQS->>Consumer: Evento de Upload
Consumer->>UseCase: Processa Mensagem
UseCase->>Gateway: Executa Processamento
Gateway->>S3: Download do Vídeo
Gateway->>Screenshot: Gera Snapshots
Screenshot->>S3: Upload do ZIP
Gateway->>DynamoDB: Atualiza Status
Gateway->>Notification: Notifica Conclusão
Notification->>SQS: Envia Notificação
- Java 21
- Spring Boot 3.2.0
- Spring Cloud AWS 3.2.0
- JavaCV 1.5.9 (processamento de vídeo)
- Project Lombok
- Amazon S3 - Armazenamento
- Amazon SQS - Mensageria
- Amazon DynamoDB - Persistência
- Amazon ECR - Registro de Containers
- Amazon EKS - Orquestração de Containers
- Docker/Docker Compose
- Kubernetes
- GitHub Actions
- SonarCloud
- Maven
- LocalStack 4.0.3
src/
├── main/
│ ├── java/
│ │ └── com/fiap/hackaton/
│ │ ├── application/
│ │ │ ├── gateways/
│ │ │ └── usecases/
│ │ ├── domain/
│ │ │ ├── enums/
│ │ │ └── exceptions/
│ │ └── infrastructure/
│ │ ├── core/
│ │ ├── gateways/
│ │ ├── persistence/
│ │ ├── presentation/
│ │ └── services/
│ │ └── utils/
│ └── resources/
│ └── application.yml
│ └── application-local.yml
│ └── application-prod.yml
UploadEventConsumer: Consumidor de eventos SQSScreenshotService: Serviço de processamento de vídeoStorageClientService: Cliente S3NotificationEventService: Serviço de notificaçãoUploadServiceDb: Gerenciamento de uploads no DynamoDB
- Java 21
- Docker e Docker Compose
- Maven
- AWS CLI (opcional)
SPRING_PROFILES_ACTIVE=local
AWS_DEFAULT_REGION=us-east-1
AWS_ACCESS_KEY_ID=fakeAccessKeyId
AWS_SECRET_ACCESS_KEY=fakeSecretAccessKey
AWS_REGION=us-east-1
DYNAMO_DB_ENDPOINT=https://localhost.localstack.cloud:4566
SQS_ENDPOINT=https://localhost.localstack.cloud:4566
S3_ENDPOINT=https://localhost.localstack.cloud:4566Recursos criados automaticamente:
# Bucket S3
bucket-fiap-hackaton-t32-files
# Filas SQS
upload-event-queue
notification-event-queue
# Tabela DynamoDB
fiap-hackaton-uploads# Iniciar ambiente
docker-compose up -d
# Verificar logs
docker-compose logs -f-
Recebimento do Evento
- Evento recebido via SQS com dados do arquivo
- Formato da mensagem processado pelo
UploadEventMessage
-
Validação
- Verificação de extensão (.mp4)
- Verificação de registro no DynamoDB
-
Processamento
- Download do vídeo do S3
- Geração de 5 snapshots em intervalos regulares
- Criação de arquivo ZIP com os snapshots
- Upload do ZIP para S3
- Atualização de status no DynamoDB
-
Notificação
- Envio de evento de conclusão via SQS
- Status atualizado para PROCESSED/ERROR
PENDING: Inicial, aguardando processamentoPROCESSED: Processamento concluído com sucessoERROR: Erro durante o processamentoNOTIFIED: Notificação enviada com sucesso
- Bucket:
bucket-fiap-hackaton-t32-files - Estrutura de pastas:
/videos- Vídeos originais/zips- Arquivos processados
upload-event-queue: Eventos de uploadnotification-event-queue: Notificações de processamento
- Tabela:
fiap-hackaton-uploads - Campos:
id(UUID - Partition Key)email(String)status(String)urlDownload(String)createdAt(Timestamp)
# Maven
./mvnw clean package
# Docker
docker build -t file-process-consumer .# Aplicar configuração
kubectl apply -f k8sdeploy.yaml
# Verificar pods
kubectl get pods -n fiapPipeline automatizado para:
- Build do projeto
- Análise SonarCloud
- Build da imagem Docker
- Push para Amazon ECR
- Deploy no Amazon EKS
- Health checks via Spring Actuator
- Logs estruturados
- Métricas de processamento
- Análise de qualidade via SonarCloud
- Fork o projeto
- Crie uma branch (
git checkout -b feature/nova-feature) - Commit suas mudanças (
git commit -m 'Adiciona nova feature') - Push para a branch (
git push origin feature/nova-feature) - Abra um Pull Request