https://github.com/bulletdev/bullet-crystal
https://github.com/bulletdev/bullet-crystal
Last synced: 5 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/bulletdev/bullet-crystal
- Owner: Bulletdev
- Created: 2025-07-17T03:02:29.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2025-07-19T19:32:39.000Z (5 months ago)
- Last Synced: 2025-07-19T21:53:49.384Z (5 months ago)
- Language: Crystal
- Size: 22.5 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 🐓 Rinha de Backend 2025 - Crystal
⢀⣴⣿⣿⣿⣿⣿⣶⣶⣶⣿⣿⣶⣶⣶⣶⣶⣿⡿⣿⣾⣷⣶⣶⣾⣿⠀
⣠⣿⣿⢿⣿⣯⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣿⡇⣿⣿⣿⣿⣿⡇
⠀⣰⣿⣿⣷⡟⠤⠟⠁⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢸⡇⣿⣿⣿⣿⣿⡇
⠀⣿⣿⣿⣿⣿⣷⣶⣿⣿⡟⠁⣮⡻⣿⣿⣿⣿⣿⣿⣿⣿⢸⡇⣿⣿⣿⣿⣿⡇
⠘⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⠀⣿⣿⣹⣿⣿⣿⣿⣿⣿⡿⢸⡇⣿⣿⣿⣿⣿⡇
⠀⠙⢿⣿⣿⣿⡿⠟⠁⣿⣿⣶⣿⠟⢻⣿⣿⣿⣿⣿⣿⡇⣼⡇⣿⣿⣿⣿⣿⠇
⠀⠀⠈⠋⠉⠁⣶⣶⣶⣿⣿⣿⣿⢀⣿⣿⣿⣿⣿⣿⣿⣇⣿⢰⣿⣿⣿⣿⣿⠀
⠀⠀⠀⠀⠀⠙⠿⣿⣿⣿⡄⢀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣽⣿⣼⣿⣿⣿⣿⠇⠀
⠀⠀⠀⠀⠀⠀⠀⠈⠉⠒⠚⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠛⠿⠿⠿⠿⠿⠋⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⣿⣙⡆⠀⠀⡇⠀⢸⠀⠀⢸⠀⠀ ⢸⡇⠀⠀⢸⣏⡉ ⠙⡏⠁⠀
⠀⠀⠀⣿⣉⡷⠀⠀⢧⣀⣼ ⠀⢸⣀ ⢸⣇⡀ ⢸⣏⣁⠀ ⠀⡇⠀
## 📋 Stack Utilizada
- **Crystal**: Linguagem de programação de alta performance
- **PostgreSQL**: Armazenamento de dados de pagamentos
- **Redis**: Cache para otimização de health checks
- **Nginx**: Load balancer com round-robin
- **Docker**: Containerização completa
## Como Executar
### 1. Subir os Payment Processors
```bash
# Primeiro, suba os payment processors
docker-compose -f docker-compose.yml up -d
```
### 2. Subir o Backend
```bash
# Depois, suba o backend
docker-compose up -d
```
### 3. Acessar a API
A API estará disponível em `http://localhost:9999`
## Endpoints da API
### POST `/payments`
Intermedia uma solicitação de pagamento para os Payment Processors.
**Corpo da Requisição:**
```json
{
"correlationId": "4a7901b8-7d26-4d9d-aa19-4dc1c7cf60b3",
"amount": 19.90
}
```
**Campos:**
- `correlationId`: UUID único obrigatório
- `amount`: Valor decimal obrigatório (maior que 0)
**Respostas:**
- `200 OK`: Pagamento processado com sucesso
- `400 Bad Request`: Dados de entrada inválidos
- `500 Internal Server Error`: Erro no processamento
### GET `/payments-summary`
Retorna resumo dos pagamentos processados, usado para auditoria.
**Parâmetros de Query (opcionais):**
- `from`: Timestamp ISO em UTC (ex: `2020-07-10T12:34:56.000Z`)
- `to`: Timestamp ISO em UTC (ex: `2020-07-10T12:35:56.000Z`)
**Exemplo de Uso:**
```
GET /payments-summary?from=2020-07-10T12:34:56.000Z&to=2020-07-10T12:35:56.000Z
```
**Resposta (200 OK):**
```json
{
"default": {
"totalRequests": 43236,
"totalAmount": 415542345.98
},
"fallback": {
"totalRequests": 423545,
"totalAmount": 329347.34
}
}
```
### POST `/purge-payments`
Endpoint secreto utilizado pelo script de teste da Rinha para limpar todos os pagamentos do banco. Não requer corpo na requisição.
**Exemplo de Uso:**
```
curl -X POST http://localhost:9999/purge-payments
```
**Resposta (200 OK):**
```json
{"result": "ok"}
```
### Limites de Memória
- API 1: 70MB
- API 2: 70MB
- PostgreSQL: 180MB
- Nginx: 20MB
- **Total: 340MB** (dentro do limite de 350MB)