Sistema de monitoramento e mapeamento de ruído urbano em tempo real, desenvolvido para a disciplina SSC0965 - Streaming de Dados, Microsserviços e Containers (ICMC/USP). A plataforma coleta leituras de sensores de decibéis, processa os dados via streaming com Apache Spark, e exibe mapas de intensidade sonora em uma aplicação Web.
![]() Bruno Janini |
![]() Vitor Alexandre |
![]() Renan |
┌─────────────────────────────────────────────────────────────────┐
│ INGESTÃO DE DADOS │
│ │
│ Sensores (Python) ──────► Kafka (sensorData) │
│ Clientes Mobile ──────► Kafka (appData) │
└──────────────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────────────▼──────────────────────────────┐
│ PROCESSAMENTO (Apache Spark) │
│ │
│ Kafka Consumer → Janelas de 30s → Agregação dB ─┬→ PostgreSQL │
│ └→ Redis │
└──────────────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────────────▼──────────────────────────────┐
│ PERSISTÊNCIA & CACHE │
│ │
│ PostgreSQL + TimescaleDB (séries temporais + métricas) │
│ Redis (cache de intensidade para mapa) │
└──────────────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────────────▼──────────────────────────────┐
│ APIs REST │
│ │
│ API Web (4344) ←── JWT ──► API Mobile (4343) │
└──────────────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────────────▼──────────────────────────────┐
│ OBSERVABILIDADE │
│ │
│ Spark UI (4040) → Prometheus (9090) → Grafana (3000) │
│ Kafka UI (8080) │
└─────────────────────────────────────────────────────────────────┘
| Serviço | Porta | Descrição |
|---|---|---|
sensor |
— | Gerador de leituras de ruído (múltiplas réplicas) |
kafka |
9092 | Message broker para ingestão de eventos |
kafka-ui |
5384 | Interface web para inspeção do Kafka |
spark |
4040, 9091 | Processamento de stream com Spark Structured Streaming |
database |
5432 | PostgreSQL + TimescaleDB (dados e métricas) |
redis |
6379 | Cache LRU para mapa de intensidade sonora |
mobile_app_api |
4343 | API REST para o app mobile |
web_app_api |
4344 | API REST para o app web |
prometheus |
9090 | Coleta de métricas do Spark |
grafana |
5284 | Dashboards de observabilidade |
frontend |
5184 | Coleta de métricas do Spark |
Todos os serviços se comunicam pela rede Docker interna soundmap-net.
- Docker 24+
- Docker Compose (incluído no Docker Desktop)
make
git clone <url-do-repositorio>
cd SoundmapCopie o exemplo e ajuste os valores conforme necessário:
cp .env.example .envPrincipais variáveis:
| Variável | Descrição |
|---|---|
SENSOR_COUNT |
Sensores simulados por container |
SENSOR_NUMBER |
Número de containers de sensores |
FREQUENCY_HZ |
Frequência de leitura em Hz |
EDGE_COMPUTING |
true ativa pré-agregação no sensor (R5) |
AREA_LAT |
Latitude do centro da área monitorada (sensores gerados ao redor deste ponto) |
AREA_LON |
Longitude do centro da área monitorada |
ROUND_ID |
Identificador da rodada experimental |
TRIGGER_INTERVAL |
Intervalo do micro-batch do Spark |
WINDOW_DURATION |
Tamanho da janela de agregação do Spark (ex: 30 seconds, 1 minute) |
WATERMARK |
Tolerância a eventos atrasados — deve ser ≥ WINDOW_DURATION (ex: 1 minute) |
SPARK_MASTER_CPUS |
Núcleos de CPU para o Spark |
API_USERNAME |
Username do usuário seed dos sensores |
API_EMAIL |
E-mail do usuário seed dos sensores |
API_PASSWORD |
Senha do usuário seed dos sensores |
O usuário definido pelas variáveis
API_*é criado automaticamente pelo seed na primeira inicialização e usado para registrar os sensores via API.
WINDOW_DURATIONcontrola a granularidade temporal dos dados emMeasuree a frequência de atualização do Redis.WATERMARKdefine por quanto tempo o Spark aguarda eventos atrasados antes de fechar uma janela — reduzir o watermark diminui a latência de atualização do mapa.
make up # sobe os serviços em segundo plano
# ou
make up-build # reconstrói as imagens antes de subirApós ~30 segundos (Kafka e banco precisam inicializar):
| Interface | URL |
|---|---|
| Kafka UI | http://localhost:5384 |
| Spark UI | http://localhost:4040 |
| Prometheus | http://localhost:9090 |
| Grafana | http://localhost:5284 (admin/admin) |
| API Web | http://localhost:4344 |
| API Mobile | http://localhost:4343 |
| App Web | http://localhost:5184 |
make down # para os serviços e remove a rede
make clean # para e APAGA os volumes (dados)make help Lista todos os comandos disponíveis
make build Constrói as imagens Docker (com cache)
make build-nc Constrói as imagens Docker (sem cache)
make up Sobe os serviços em background
make up-build Reconstrói e sobe os serviços
make down Para os serviços e remove a rede
make restart Reinicia (down + up)
make logs Exibe logs em tempo real (Ctrl+C para sair)
make ps Lista os containers em execução
make clean Para e APAGA todos os volumes ⚠️ perda de dados
- sensors/ — Gerador de dados de sensores
- spark/ — Pipeline de processamento de stream
- database/ — Esquema do banco de dados
- grafana/ — Dashboards de observabilidade
- prometheus/ — Configuração de coleta de métricas
- Cada container
sensorgera leituras de ruído (55–95 dB) com localização GPS simulada e as publica no tópico KafkasensorData. - O
sparkconsome o tópico em micro-batches, agrega as leituras em janelas deslizantes de 30 segundos (média logarítmica + pico), e persiste os resultados no PostgreSQL. - As APIs consultam o banco e o Redis para servir dados às aplicações cliente.
- O Prometheus raspa métricas do Spark a cada 10 segundos; o Grafana exibe dashboards em tempo real.
O sistema foi projetado para executar experimentos de desempenho de streaming. A tabela batch_metrics no banco registra latência e throughput por batch, permitindo análise comparativa entre configurações.
| Rodada | Variável alterada |
|---|---|
| R1 | Configuração base |
| R2–R3 | TRIGGER_INTERVAL e SPARK_MASTER_CPUS variáveis, carga variável |






