Pendahuluan
FastAPI adalah framework Python modern yang sangat cepat untuk membangun API. Namun, secara default, FastAPI development server (uvicorn) hanya menjalankan satu worker process, yang berarti hanya bisa menangani satu request pada satu waktu. Untuk production dan handling concurrent requests, kita memerlukan Gunicorn sebagai process manager.
Gunicorn (Green Unicorn) adalah HTTP server untuk Python yang dapat menjalankan multiple worker processes, memungkinkan aplikasi FastAPI kita menangani banyak request secara bersamaan.
Mengapa Gunicorn?
Keuntungan menggunakan Gunicorn:- Multiple worker processes untuk concurrent request handling
- Load balancing otomatis antar workers
- Graceful restart tanpa downtime
- Production-ready dan battle-tested
- Kompatibel dengan uvicorn workers untuk async support
Instalasi
Pertama, install dependencies yang diperlukan:
pip install fastapi uvicorn gunicorn
Atau tambahkan ke requirements.txt:
fastapi==0.109.0
uvicorn[standard]==0.27.0
gunicorn==21.2.0
Kemudian install:
pip install -r requirements.txt
Membuat Aplikasi FastAPI Sederhana
Buat file main.py:
from fastapi import FastAPI
import time
import os
app = FastAPI()
@app.get("/")
async def root():
return {
"message": "Hello World",
"workerpid": os.getpid()
}
@app.get("/slow")
async def slowendpoint():
# Simulasi operasi yang memakan waktu
time.sleep(5)
return {
"message": "This took 5 seconds",
"workerpid": os.getpid()
}
@app.get("/health")
async def healthcheck():
return {"status": "healthy"}
Setup Gunicorn dengan Uvicorn Workers
Gunicorn sendiri adalah synchronous server. Untuk mendapatkan async benefits dari FastAPI, kita menggunakan Uvicorn workers.
Menjalankan dengan Command Line
gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
Parameter penjelasan:
main:app- module:application (main.py dengan variable app)--workers 4- jumlah worker processes--worker-class uvicorn.workers.UvicornWorker- gunakan async uvicorn workers--bind 0.0.0.0:8000- host dan port
Membuat Configuration File
Buat file gunicornconf.py untuk konfigurasi yang lebih terstruktur:
import multiprocessing
import os
Server Socket
bind = "0.0.0.0:8000"
backlog = 2048
Worker Processes
workers = int(os.getenv("WORKERS", multiprocessing.cpucount() 2 + 1))
workerclass = "uvicorn.workers.UvicornWorker"
workerconnections = 1000
maxrequests = 10000
maxrequestsjitter = 1000
timeout = 120
keepalive = 5
Logging
accesslog = "-"
errorlog = "-"
loglevel = "info"
accesslogformat = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" %(D)s'
Process Naming
procname = "fastapiapp"
Server Mechanics
daemon = False
pidfile = None
user = None
group = None
tmpuploaddir = None
Graceful Timeout
gracefultimeout = 30
Jalankan dengan config file:
gunicorn main:app -c gunicornconf.py
Menentukan Jumlah Workers yang Optimal
Formula umum untuk menentukan jumlah workers:
workers = (2 CPUCORES) + 1
Contoh:
- 2 CPU cores = 5 workers
- 4 CPU cores = 9 workers
- 8 CPU cores = 17 workers
- Untuk CPU-bound tasks: gunakan formula di atas
- Untuk I/O-bound tasks: bisa lebih banyak workers
- Monitor memory usage, jangan sampai kehabisan RAM
- Start dengan formula standar, lalu adjust berdasarkan monitoring
Testing Concurrent Requests
Test apakah concurrent invocation bekerja dengan benar.