Skip to content

Commit aa66442

Browse files
committed
feat: configurar balanceamento de carga com NGINX
1 parent 5ae16ba commit aa66442

File tree

8 files changed

+109
-12
lines changed

8 files changed

+109
-12
lines changed

.env_example

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
BACKEND_URL=http://backend:8000
1+
BACKEND_URL=http://nginx
22

33
DB_HOST_PROD = <example>
44
DB_PORT_PROD = <example>

README.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
Este projeto descreve uma arquitetura de pipeline de dados de baixo custo voltada para startups, com foco em integração de dados de vendas a partir de APIs e CRMs, utilizando tecnologias modernas e acessíveis. O objetivo é criar uma solução escalável para ingestão, transformação e visualização de dados, garantindo que tanto engenheiros de dados quanto analistas possam colaborar eficientemente. A arquitetura proposta inclui a divisão do pipeline em múltiplas camadas (Bronze, Silver e Gold), integração com APIs, Airbyte para ingestão de dados, Airflow para orquestração e DBT para transformação de dados. A plataforma colaborativa "Briefer" também é integrada, permitindo que analistas de dados acessem e utilizem os dados transformados de forma eficiente.
2020

2121
<p align="center">
22-
<img src = "./img/arquitetura_1.5.png">
22+
<img src = "./img/arquitetura_1.6.png">
2323
</p>
2424

2525
#### **Assistente IA Especialista em Analise de Dados e Vendas**
@@ -99,7 +99,19 @@ graph TD
9999
#### FastAPI com Swagger
100100
- **Descrição:** FastAPI é um framework moderno e de alto desempenho para a construção de APIs com Python 3.6+ baseado em tipos de dados. Ele é projetado para ser rápido e fácil de usar, oferecendo validação automática de dados e documentação interativa.
101101
- **Uso no Projeto:** Utilizado para criar a API que manipula dados de funcionários, produtos e vendas. O FastAPI gera automaticamente a documentação da API utilizando Swagger, permitindo que os desenvolvedores testem as endpoints diretamente pela interface.
102-
- **Acessando o Swagger:** Após iniciar a aplicação com o comando `uvicorn main:app --reload`, a documentação do Swagger pode ser acessada em `http://127.0.0.1:8000/docs`.
102+
- **Acessando o Swagger:** Após iniciar a aplicação com o comando `uvicorn main:app --reload`, a documentação do Swagger pode ser acessada em `http://127.0.0.1:80/docs`.
103+
104+
#### NGINX
105+
- **Descrição:** NGINX é um servidor web de alto desempenho que também pode atuar como um balanceador de carga e proxy reverso. Sua arquitetura assíncrona o torna extremamente rápido e eficiente no uso de recursos.
106+
- **Uso no Projeto:** O NGINX está sendo usado como load balancer, distribuindo as requisições entre múltiplas instâncias do backend (Backend-1, Backend-2, Backend-3). Assim, se algum backend estiver sobrecarregado, o NGINX encaminha requisições para outro backend disponível. Ele garante maior disponibilidade (caso um container falhe, ainda há outros disponíveis), ajuda na escalabilidade (suportando mais requisições) e melhora a performance ao distribuir de forma equilibrada o tráfego entre os backends.
107+
108+
```mermaid
109+
graph TD
110+
A[Usuário] --> |Envia Requisição HTTP| B{NGINX (Load Balancer)}
111+
B --> |Distribui Requisições| C[Backend-1]
112+
B --> |Distribui Requisições| D[Backend-2]
113+
B --> |Distribui Requisições| E[Backend-3]
114+
```
103115

104116
#### **Streamlit**
105117

app/backend/main.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from fastapi import FastAPI
2+
import socket
23
from database.database import engine
34

45
import models.product.product
@@ -16,7 +17,12 @@
1617
models.employee.employee.Base.metadata.create_all(bind=engine)
1718
models.supplier.supplier.Base.metadata.create_all(bind=engine)
1819

19-
app = FastAPI()
20+
app = FastAPI(docs_url="/docs", openapi_url="/openapi.json")
21+
22+
@app.get("/whoami") # Endpoint para teste de load balance
23+
def whoami():
24+
return {"hostname": socket.gethostname()}
25+
2026
app.include_router(product_router)
2127
app.include_router(sales_router)
2228
app.include_router(employee_router)

app/frontend/app.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,18 +72,18 @@ def home(self):
7272
"""
7373
Transforme sua startup com nossa solução de pipeline de dados de última geração!
7474
75-
### 🎯 Nossa Missão
75+
### Nossa Missão
7676
Capacitar startups com uma arquitetura de dados robusta, escalável e econômica,
7777
permitindo que você se concentre no crescimento do seu negócio.
7878
79-
### 🔑 Principais Benefícios
79+
### Principais Benefícios
8080
- **Economia**: Solução de baixo custo ideal para startups
8181
- **Eficiência**: Processamento e análise rápida de dados de vendas
8282
- **Escalabilidade**: Cresce com seu negócio
8383
- **Integração**: Conecta-se facilmente com APIs e CRMs existentes
8484
- **Colaboração**: Facilita o trabalho entre engenheiros e analistas de dados
8585
86-
### 🛠️ Nossa Tecnologia
86+
### Nossa Tecnologia
8787
- Pipeline em camadas: Bronze, Silver e Gold
8888
- Airbyte para ingestão de dados flexível
8989
- Airflow para orquestração poderosa
@@ -219,7 +219,7 @@ def about(self):
219219
6. Plataforma 'Briefer' para acesso e utilização dos dados transformados
220220
""")
221221

222-
st.image("https://raw.githubusercontent.com/tsffarias/LiftOff_Data/refs/heads/main/img/arquitetura_1.5.png", use_container_width=True, caption="Arquitetura do Pipeline de Dados")
222+
st.image("https://raw.githubusercontent.com/tsffarias/LiftOff_Data/refs/heads/main/img/arquitetura_1.6.png", use_container_width=True, caption="Arquitetura do Pipeline de Dados")
223223

224224
st.divider()
225225

app/frontend/dashboard/dashboard.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ def display_metrics(sales_df, employee_df):
6262
st.warning("⚠️ Coluna 'id' ausente no DataFrame de vendas.")
6363

6464
# Verifica se a coluna 'quantidade' está presente
65-
if 'quantidade' in sales_df.columns:
66-
total_itens = sales_df['quantidade'].sum()
65+
if 'quantity' in sales_df.columns:
66+
total_itens = sales_df['quantity'].sum()
6767
else:
6868
total_itens = 0
6969
st.warning("⚠️ Coluna 'quantidade' ausente no DataFrame de vendas.")

docker-compose.yml

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ services:
1818
networks:
1919
- mynetwork
2020

21-
backend:
21+
backend-1:
22+
hostname: backend-1
2223
build:
2324
context: ./app/backend
2425
dockerfile: Dockerfile
@@ -33,12 +34,69 @@ services:
3334
env_file:
3435
- .env
3536
ports:
36-
- "8000:8000"
37+
- "8001:8000"
3738
depends_on:
3839
- postgres
3940
networks:
4041
- mynetwork
4142

43+
backend-2:
44+
hostname: backend-2
45+
build:
46+
context: ./app/backend
47+
dockerfile: Dockerfile
48+
volumes:
49+
- ./app/backend:/main
50+
environment:
51+
DB_HOST_PROD: ${DB_HOST_PROD}
52+
DB_PORT_PROD: ${DB_PORT_PROD}
53+
DB_NAME_PROD: ${DB_NAME_PROD}
54+
DB_USER_PROD: ${DB_USER_PROD}
55+
DB_PASS_PROD: ${DB_PASS_PROD}
56+
env_file:
57+
- .env
58+
ports:
59+
- "8002:8000"
60+
depends_on:
61+
- postgres
62+
networks:
63+
- mynetwork
64+
65+
backend-3:
66+
hostname: backend-3
67+
build:
68+
context: ./app/backend
69+
dockerfile: Dockerfile
70+
volumes:
71+
- ./app/backend:/main
72+
environment:
73+
DB_HOST_PROD: ${DB_HOST_PROD}
74+
DB_PORT_PROD: ${DB_PORT_PROD}
75+
DB_NAME_PROD: ${DB_NAME_PROD}
76+
DB_USER_PROD: ${DB_USER_PROD}
77+
DB_PASS_PROD: ${DB_PASS_PROD}
78+
env_file:
79+
- .env
80+
ports:
81+
- "8003:8000"
82+
depends_on:
83+
- postgres
84+
networks:
85+
- mynetwork
86+
87+
nginx:
88+
image: nginx:latest
89+
ports:
90+
- "80:80"
91+
volumes:
92+
- ./nginx.conf:/etc/nginx/nginx.conf
93+
depends_on:
94+
- backend-1
95+
- backend-2
96+
- backend-3
97+
networks:
98+
- mynetwork
99+
42100
frontend:
43101
build:
44102
context: ./app/frontend

img/arquitetura_1.6.png

226 KB
Loading

nginx.conf

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
events {}
2+
3+
http {
4+
upstream api_servers {
5+
server backend-1:8000;
6+
server backend-2:8000;
7+
server backend-3:8000;
8+
}
9+
10+
server {
11+
listen 80;
12+
13+
location / {
14+
proxy_pass http://api_servers;
15+
proxy_set_header Host $host;
16+
proxy_set_header X-Real-IP $remote_addr;
17+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
18+
proxy_set_header X-Forwarded-Proto $scheme;
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)