Sistema distribuído para gerenciamento de posts com processamento assíncrono de texto utilizando mensageria RabbitMQ.
O AlgaPosts é um sistema composto por dois microsserviços que trabalham em conjunto para criar, processar e consultar posts de texto. O sistema utiliza comunicação assíncrona para processar o conteúdo dos posts em segundo plano, calculando estatísticas como contagem de palavras e valores estimados.
-
Responsabilidades:
- Exposição de API REST para criação e consulta de posts
- Persistência dos dados em banco H2
- Envio de posts para processamento via RabbitMQ
- Recepção dos resultados do processamento
-
Endpoints:
POST /api/posts- Cria um novo postGET /api/posts/{id}- Consulta um post específicoGET /api/posts?page=0&size=10- Lista posts paginados
- Responsabilidades:
- Processamento assíncrono do conteúdo dos posts
- Contagem de palavras no texto
- Cálculo do valor estimado (R$ 0,10 por palavra)
- Envio dos resultados processados de volta ao PostService
- Java 21
- Spring Boot 3.4.9
- Spring AMQP (RabbitMQ)
- Spring Data JPA
- H2 Database
- Lombok
- Maven
- Docker Compose
algaposts/
├── docker-compose.yml
├── microservices/
│ ├── post/ # PostService
│ │ ├── src/main/java/com/algaposts/post/
│ │ │ ├── api/ # Controllers e DTOs
│ │ │ ├── domain/ # Entidades e Services
│ │ │ ├── infrastructure/ # Configurações RabbitMQ
│ │ │ └── mapper/ # Mapeadores
│ │ └── pom.xml
│ └── text_processor/ # TextProcessorService
│ ├── src/main/java/com/algaposts/text_processor/
│ │ ├── domain/ # Services e estratégias
│ │ └── infrastructure/ # Messaging e configurações
│ └── pom.xml
└── README.md
- Java 21+
- Maven 3.6+
- Docker e Docker Compose
docker-compose up -dIsso irá subir o RabbitMQ com:
- URL Management: http://localhost:15672
- Usuário/Senha: rabbitmq/rabbitmq
- Porta AMQP: 5672
cd microservices/text_processor
./mvnw spring-boot:runcd microservices/post
./mvnw spring-boot:run- Exchange:
post-processing-exchange.v1.e - Fila de entrada:
text-processor-service.post-processing.v1.q - Fila de resultado:
post-service.post-processing-result.v1.q - DLQ:
text-processor-service.post-processing.v1.dlq
- PostService envia mensagem para processamento:
{
"postId": "uuid",
"postBody": "texto do post"
}- TextProcessorService processa e envia resultado:
{
"postId": "uuid",
"wordCount": 123,
"calculatedValue": 12.30
}curl -X POST http://localhost:8080/api/posts \
-H "Content-Type: application/json" \
-d '{
"title": "Meu Primeiro Post",
"body": "Este é o conteúdo do meu primeiro post no sistema AlgaPosts.",
"author": "João Silva"
}'Resposta:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Meu Primeiro Post",
"body": "Este é o conteúdo do meu primeiro post no sistema AlgaPosts.",
"author": "João Silva",
"wordCount": null,
"calculatedValue": null
}curl http://localhost:8080/api/posts/550e8400-e29b-41d4-a716-446655440000Resposta:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Meu Primeiro Post",
"body": "Este é o conteúdo do meu primeiro post no sistema AlgaPosts.",
"author": "João Silva",
"wordCount": 12,
"calculatedValue": 1.20
}curl "http://localhost:8080/api/posts?page=0&size=5"Resposta:
{
"content": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Meu Primeiro Post",
"summary": "Este é o conteúdo do meu primeiro post no sistema AlgaPosts.",
"author": "João Silva"
}
],
"totalElements": 1,
"totalPages": 1,
"size": 5,
"number": 0
}{
"title": "string (obrigatório)",
"body": "string (obrigatório, não vazio)",
"author": "string (obrigatório)"
}{
"id": "UUID",
"title": "string",
"body": "string",
"author": "string",
"wordCount": "integer",
"calculatedValue": "decimal"
}{
"id": "UUID",
"title": "string",
"summary": "string (primeiras 350 caracteres + '...')",
"author": "string"
}server:
port: 8080
spring:
datasource:
url: jdbc:h2:file:~/algaposts-post-db
rabbitmq:
host: localhost
port: 5672
username: rabbitmq
password: rabbitmqserver:
port: 8081
spring:
rabbitmq:
host: localhost
port: 5672
username: rabbitmq
password: rabbitmqO sistema implementa processamento assíncrono com as seguintes características:
- Retry automático: até 3 tentativas com backoff exponencial
- Dead Letter Queue: mensagens com falha são redirecionadas para DLQ
- Prefetch: controle de fluxo com 4 mensagens por vez
- Acknowledgment: confirmação automática após processamento bem-sucedido
- URL: http://localhost:15672
- Usuário: rabbitmq
- Senha: rabbitmq
- URL: http://localhost:8080/h2-console
- JDBC URL:
jdbc:h2:file:~/algaposts-post-db - Usuário: sa
- Senha: (vazia)
- Suba toda a infraestrutura:
docker-compose up -d
cd microservices/text_processor && ./mvnw spring-boot:run &
cd microservices/post && ./mvnw spring-boot:run &- Crie um post:
curl -X POST http://localhost:8080/api/posts \
-H "Content-Type: application/json" \
-d '{
"title": "Teste de Processamento",
"body": "Este texto possui exatamente dez palavras para testar o processamento.",
"author": "Usuário de Teste"
}'- Aguarde alguns segundos e consulte o resultado:
curl http://localhost:8080/api/posts/{id-retornado}- Verifique que
wordCount= 10 ecalculatedValue= 1.00
-
RabbitMQ não conecta:
- Verifique se o Docker está rodando
- Confirme se a porta 5672 está livre
- Execute
docker-compose logs algaposts-rabbitmq
-
Post não é processado:
- Verifique os logs do TextProcessorService
- Consulte o RabbitMQ Management para ver filas
- Verifique se ambos os serviços estão rodando
-
Erro 404 ao consultar post:
- Confirme se o ID está correto
- Verifique se o post foi salvo no H2
# PostService
tail -f logs/post-service.log
# TextProcessorService
tail -f logs/text-processor-service.logEste projeto foi desenvolvido como parte do desafio AlgaWorks e é destinado para fins educacionais.
Luis Paulo