Python & FastAPI backend — šiuolaikiniai ir keičiamo mastelio API
FastAPI – pagrindinis Python karkasas asinchroniniams REST API. Jis derina natūralius Python type hints su automatine Pydantic validacija, automatiškai generuojama OpenAPI dokumentacija ir ASGI našumu, panašiu į Node.js, – neaukojant kodo skaitomumo.
FastAPI – greitas Python karkasas
FastAPI veikia ant Uvicorn (ASGI serverio), o produkcijoje daugiaprocesiškumui naudojamas Gunicorn. Paprastas endpoint, skaitantis iš Redis talpyklos, standartinėje aparatinėje įrangoje atsako per mažiau nei 5 ms. Natūralus Dependency Injection leidžia izoliuotai testuoti bet kurį sluoksnį be sudėtingų mock’ų: autentifikacija, duomenų bazės sesija, užklausų ribojimas – kiekvienas jų yra injektuojama priklausomybė.
OpenAPI 3.1 dokumentacija generuojama automatiškai iš type hints – Swagger UI ir ReDoc kūrimo aplinkoje pasiekiami adresais `/docs` ir `/redoc`. Pydantic v2 schema (validatorius, parašytas Rust) tikrina užklausas ir atsakymus 10–20 kartų greičiau nei Pydantic v1. Bet kuris netinkamas laukas grąžina 422 su aiškiais, lokalizuotais klaidų pranešimais.
- Natūralus async/await – neblokuojantis I/O visoms DB ir HTTP operacijoms
- BackgroundTasks operacijoms po atsakymo (el. paštas, webhook, žurnalas)
- Natūrali WebSocket parama realaus laiko funkcijoms (pokalbiai, pranešimai)
- Užklausų ribojimas su slowapi (paremtas limits) – pagal IP ir pagal naudotoją
- Middleware: CORS, suspaudimas (gzip/brotli), request ID, laiko matavimas
PostgreSQL, SQLAlchemy ir Alembic
Visoms DB operacijoms naudojame SQLAlchemy 2.0 async (asyncpg tvarkyklė). Modeliai apibrėžiami su Mapped tipais – tipų saugūs, be eilučių. Sudėtingos užklausos rašomos SQLAlchemy Core (tikrinamos kompiliavimo metu) arba gryname SQL per `text()` su bind parametrais – niekada nenaudojant eilučių interpoliacijos (visiška SQLi prevencija).
Alembic migracijos generuojamos automatiškai iš modelių pakeitimų ir prieš taikymą peržiūrimos rankiniu būdu. Kiekviena migracija turi ištestuotus `upgrade()` ir `downgrade()`. Produkcijoje migracijos vykdomos CI prieš diegimą – duomenų bazė visada sinchronizuota su kodu. Jungčių telkimas per asyncpg su konfigūruojamu telkinio dydžiu kiekvienai paslaugai.
- Eilučių lygio užraktai su `SELECT ... FOR UPDATE` kritinėms lygiagrečioms operacijoms
- Pilnatekstė paieška su pg_trgm ir tsvector – be Elasticsearch paprastiems atvejams
- JSONB pusiau struktūrizuotiems duomenims su GIN indeksavimu
- Skaidytos lentelės (partition) lentelėms su milijonais eilučių (žurnalai, įvykiai)
Redis talpykla ir horizontalus mastelio didinimas
Redis 7 naudojamas programos talpyklai (TTL kiekvienam endpoint), sesijų saugyklai (JWT refresh tokenai su selektyviu atšaukimu), pub/sub realaus laiko įvykiams ir eilėms foninėms užduotims (Celery arba ARQ). Talpyklos strategija – cache-aside su aiškiu invalidavimu, o ne aklas TTL, kuris gali pateikti pasenusius duomenis.
- JWT autentifikacija su access tokenu (15 min.) + Redis refresh tokenu (7 dienos)
- Celery + Redis brokeris asinchroninėms užduotims (PDF generavimas, el. paštas, importai)
- Sveikatos patikros endpoint `/health` su DB, Redis būsena ir diegimo versija
- Struktūrizuotas JSON žurnalas (structlog) – suderinamas su Loki/Datadog/ELK
Privalumai ir apribojimai
Privalumai
- ASGI našumas, panašus į Node.js ir Go I/O užduotyse.
- OpenAPI dokumentacija generuojama automatiškai iš type hints.
- Greita Pydantic v2 validacija su aiškiomis 422 klaidomis.
- Skaitomas kodas, daugumai komandų pažįstamas Python.
Apribojimai
- Python išlieka lėtesnis nei Go ar Rust daug procesoriaus reikalaujančiose užduotyse.
- async/await reikalauja drausmės – vienas blokuojantis iškvietimas užblokuoja visą event loop.
- Jaunesnė ekosistema nei Django funkcijoms „viskas įskaičiuota“.
- Neturi įtaisyto ORM ar admin – juos renkiesi atskirai.
Trumpa išvada
Rinkitės FastAPI asinchroniniams REST API, mikropaslaugoms ir SPA/mobiliųjų programų backend’ams. Itin daug procesoriaus reikalaujančioms programoms ar monolitams su paruošta admin pasirinkimas gali būti atitinkamai Go arba Django.
Specifikacijų lentelė
| Galimybė | Riba / slenkstis | Tipinis naudojimas | |
|---|---|---|---|
| Lygiagretumas | async/await, neblokuojantis I/O | Daug procesoriaus reikalaujančioms užduotims reikia atskirų worker’ių | API su daug DB/HTTP kreipinių |
| Delsa | < 5 ms endpoint su Redis talpykla | Didėja serializuojant dideles apkrovas | SaaS, mobiliųjų programų ir realaus laiko backend |
| Validacija ir dokumentai | Pydantic v2 + automatinė OpenAPI 3.1 | Sudėtinga schema pailgina paleidimo laiką | Viešieji API su Swagger/ReDoc |
| Tipinė kaina | Atvirasis kodas, veikia su 1 vCPU | Horizontaliam didinimui reikia daugiau procesų | Nuo MVP iki produkcijos |
FastAPI ir alternatyvos
| Kriterijus | FastAPI | Django / Express |
|---|---|---|
| Asinchroninis našumas | Puikus (natūralus ASGI) | Django iš dalies, Express geras |
| Automatinė OpenAPI dokumentacija | Taip, iš type hints | Reikia papildomų paketų |
| Įtaisyta admin / ORM | Ne (renkiesi atskirai) | Django: taip; Express: ne |
Dažniausiai užduodami klausimai
Ar FastAPI greitesnis už Django?
Taip, I/O užduotyse. FastAPI veikia asinchroniškai ant ASGI, todėl su DB/HTTP kreipiniais apdoroja daug daugiau lygiagrečių užklausų nei klasikinis sinchroninis Django. Tačiau Django turi daugiau įtaisytų funkcijų.
Kam FastAPI netinka?
Itin daug procesoriaus reikalaujančioms užduotims (vaizdų apdorojimas, sudėtingi skaitiniai skaičiavimai) Python lėtesnis už Go ar Rust; jas perkeli į atskirus worker’ius. Be to, jis neturi paruoštos admin, kaip Django.
Ar FastAPI reikia ORM?
Nebūtinai. Naudojame SQLAlchemy 2.0 async su Alembic migracijoms, bet gali rašyti ir gryną SQL. ORM neįtrauktas, todėl jį renkiesi pagal projektą.
Kaip keisti FastAPI backend’o mastelį?
Horizontaliai: paleidi kelis Uvicorn procesus po Gunicorn, už apkrovos balansuotojo, su Redis talpykla ir sunkiomis užduotimis, perkeltomis į Celery. Be būsenos (stateless) architektūra leidžia prireikus pridėti instancijų.