O projeto desenvolvido em Python para a Rinha de Backend, edição 2024/Q1.
O projeto consiste em uma API HTTP desenvolvida com Python e Django, utilizando PostgreSQL como banco de dados e Redis para armazenamento temporário. Além disso, foi configurado Nginx como proxy reverso e PgBouncer como pool de banco de dados.
O maior desafio do projeto foi otimizar a configuração para que o consumo de CPU não ultrapassasse 1,5 unidades, dadas as demandas pesadas do framework Django.
- Python
- Django 5.0.2
- PostgreSQL
- Redis
- Nginx
POST /clientes/[id]/transacoes
{
"valor": 1000,
"tipo" : "c",
"descricao" : "descricao"
}
Onde:
- [id] (na URL) deve ser um número inteiro representando a identificação do cliente.
- valor deve ser um número inteiro positivo representando centavos.
- tipo deve ser 'c' para crédito ou 'd' para débito.
- descricao deve ser uma string de 1 a 10 caracteres.
HTTP 200 OK
{
"limite" : 100000,
"saldo" : -9098
}
Onde:
- limite é o limite cadastrado do cliente.
- saldo é o novo saldo após a conclusão da transação.
GET /clientes/[id]/extrato
Onde:
- [id] (na URL) deve ser um número inteiro representando a identificação do cliente.
HTTP 200 OK
{
"saldo": {
"total": -9098,
"data_extrato": "2024-01-17T02:34:41.217753Z",
"limite": 100000
},
"ultimas_transacoes": [
{
"valor": 10,
"tipo": "c",
"descricao": "descricao",
"realizada_em": "2024-01-17T02:34:38.543030Z"
},
{
"valor": 90000,
"tipo": "d",
"descricao": "descricao",
"realizada_em": "2024-01-17T02:34:38.543030Z"
}
]
}
Onde:
- saldo total é o saldo total atual do cliente.
- data_extrato é a data/hora da consulta do extrato.
- limite é o limite cadastrado do cliente.
- ultimas_transacoes é uma lista ordenada por data/hora das transações.
Para executar o projeto, você precisará do Docker e Docker Compose instalados em seu ambiente. Certifique-se de configurar adequadamente o arquivo docker-compose.yml
para respeitar as restrições de recursos de CPU e memória.
- Clone o repositório.
- Navegue até o diretório do projeto.
- Execute
docker-compose up
para construir e iniciar os contêineres. - Acesse a API através do endpoint fornecido pelo seu load balancer na porta 9999.
Abaixo estão os prints de uso de recursos e do teste de desempenho:
Julio Cezar Riffel