Backend Python & FastAPI — API modern yang skalabel
FastAPI adalah framework Python acuan untuk REST API asinkron. Ia memadukan type hints Python native dengan validasi Pydantic otomatis, dokumentasi OpenAPI yang dihasilkan otomatis, dan server ASGI untuk I/O asinkron — tanpa mengorbankan keterbacaan kode.
FastAPI — framework Python untuk API asinkron
FastAPI berjalan di Uvicorn (server ASGI) dengan Gunicorn untuk multi-proses di produksi. Endpoint sederhana yang membaca dari cache Redis melewati query database untuk data yang sudah di-cache. Dependency Injection native memungkinkan pengujian terisolasi pada lapisan mana pun tanpa mock yang rumit: autentikasi, sesi database, rate limiting — masing-masing adalah dependency yang dapat diinjeksi.
Dokumentasi OpenAPI 3.1 dihasilkan otomatis dari type hints — Swagger UI dan ReDoc tersedia di `/docs` dan `/redoc` pada lingkungan pengembangan. Skema Pydantic v2 (validator berbasis Rust) memvalidasi request dan response. Setiap field yang tidak valid mengembalikan 422 dengan pesan error yang jelas dan terlokalisasi.
- async/await native — I/O non-blocking pada semua operasi DB dan HTTP
- BackgroundTasks untuk operasi pasca-respons (email, webhook, log)
- Dukungan WebSocket native untuk fitur real-time (chat, notifikasi)
- Rate limiting dengan slowapi (berbasis limits) — per-IP dan per-pengguna
- CORS, kompresi (gzip/brotli), request ID, middleware pengukur waktu
PostgreSQL, SQLAlchemy, dan Alembic
Kami memakai SQLAlchemy 2.0 async (driver asyncpg) untuk semua operasi DB. Model didefinisikan dengan tipe Mapped — type-safe, tanpa string. Query kompleks ditulis dengan SQLAlchemy Core (dicek saat kompilasi) atau SQL murni lewat `text()` dengan bind parameter — tidak pernah interpolasi string (pencegahan SQLi menyeluruh).
Migrasi Alembic dihasilkan otomatis dari perubahan model dan ditinjau manual sebelum diterapkan. Setiap migrasi memiliki `upgrade()` dan `downgrade()` yang telah diuji. Di produksi, migrasi dijalankan di CI sebelum deploy — database selalu sinkron dengan kode. Connection pooling lewat asyncpg dengan ukuran pool yang dapat dikonfigurasi per layanan.
- Row-level locking dengan `SELECT ... FOR UPDATE` untuk operasi konkuren yang kritis
- Pencarian teks lengkap dengan pg_trgm dan tsvector — tanpa Elasticsearch untuk kasus sederhana
- JSONB untuk data semi-terstruktur dengan indeks GIN
- Tabel partisi untuk tabel dengan jutaan baris (log, event)
Caching Redis dan skalabilitas horizontal
Redis 7 dipakai untuk cache aplikasi (TTL per endpoint), penyimpanan sesi (refresh token JWT dengan pencabutan selektif), pub/sub untuk event real-time, dan antrean untuk job latar belakang (Celery atau ARQ). Strategi caching-nya cache-aside dengan invalidasi eksplisit — bukan TTL buta yang bisa menyajikan data usang.
- Autentikasi JWT dengan access token (15 menit) + refresh token Redis (7 hari)
- Celery + broker Redis untuk tugas asinkron (pembuatan PDF, email, impor)
- Endpoint health check `/health` dengan status DB, Redis, dan versi deploy
- Logging JSON terstruktur (structlog) — kompatibel dengan Loki/Datadog/ELK
Kelebihan dan keterbatasan
Kelebihan
- Async I/O native di ASGI untuk panggilan DB dan HTTP.
- Dokumentasi OpenAPI dihasilkan otomatis dari type hints.
- Validasi Pydantic v2 yang cepat, dengan error 422 yang jelas.
- Kode mudah dibaca, Python akrab bagi sebagian besar tim.
Keterbatasan
- Python tetap lebih lambat dari Go atau Rust pada tugas intensif CPU.
- async/await menuntut disiplin — satu panggilan blocking menghentikan seluruh event loop.
- Ekosistem lebih muda dibanding Django untuk fitur lengkap bawaan.
- Tidak ada ORM atau admin bawaan — Anda memilihnya secara terpisah.
Kesimpulan singkat
Pilih FastAPI untuk REST API asinkron, microservice, dan backend untuk SPA/mobile. Untuk aplikasi yang sangat terikat CPU atau monolit dengan admin siap pakai, masing-masing Go atau Django bisa lebih cocok.
Tabel spesifikasi
| Kemampuan | Batas / ambang | Penggunaan umum | |
|---|---|---|---|
| Konkurensi | async/await, I/O non-blocking | Tugas terikat CPU membutuhkan worker terpisah | API dengan banyak panggilan DB/HTTP |
| Latensi | Endpoint berbasis cache Redis | Bertambah seiring serialisasi payload besar | SaaS, mobile, backend real-time |
| Validasi & dokumentasi | Pydantic v2 + OpenAPI 3.1 otomatis | Skema kompleks menambah waktu startup | API publik dengan Swagger/ReDoc |
| Biaya umum | Open-source, berjalan di 1 vCPU | Penskalaan horizontal butuh lebih banyak proses | Dari MVP hingga produksi |
FastAPI vs alternatif
| Kriteria | FastAPI | Django / Express |
|---|---|---|
| Kinerja asinkron | Sangat baik (ASGI native) | Django sebagian, Express baik |
| Dokumentasi OpenAPI otomatis | Ya, dari type hints | Butuh paket tambahan |
| Admin / ORM bawaan | Tidak (pilih terpisah) | Django: ya; Express: tidak |
Pertanyaan yang sering diajukan
Apakah FastAPI lebih cepat dari Django?
Ya untuk I/O. FastAPI berjalan asinkron di ASGI, sehingga menangani jauh lebih banyak request konkuren dengan panggilan DB/HTTP dibanding Django sinkron klasik. Namun Django memiliki lebih banyak fitur bawaan.
Untuk apa FastAPI kurang cocok?
Untuk tugas yang sangat terikat CPU (pemrosesan gambar, komputasi numerik berat), Python lebih lambat dari Go atau Rust; tugas itu dipindahkan ke worker terpisah. FastAPI juga tidak memiliki admin siap pakai seperti Django.
Apakah FastAPI membutuhkan ORM?
Tidak wajib. Kami memakai SQLAlchemy 2.0 async dengan Alembic untuk migrasi, tetapi Anda bisa menulis SQL murni. ORM tidak disertakan, sehingga Anda memilihnya per proyek.
Bagaimana cara menskalakan backend FastAPI?
Secara horizontal: jalankan beberapa proses Uvicorn di bawah Gunicorn di balik load balancer, dengan cache Redis dan tugas berat dipindahkan ke Celery. Desain stateless memungkinkan Anda menambah instance sesuai kebutuhan.