4. Solution Strategy¶
4.1 Fundamental Decisions¶
Goal |
Strategy |
|---|---|
Maintainability |
Three bounded contexts as separate FastAPI applications, each owning its PostgreSQL schema |
Performance |
Async I/O throughout (FastAPI + asyncpg); feed aggregation via pre-computed read models |
Scalability |
Stateless API processes; horizontal scaling behind a load balancer |
Security |
JWT-based authentication issued by the Users context; validated by all other contexts |
Developer experience |
OpenAPI specs auto-generated by FastAPI; React frontend consumes typed API clients |
4.2 Architecture Style¶
Modular monorepo deployment: all three bounded contexts run as independent FastAPI processes but are developed in a single repository. This allows independent scaling while keeping cross-team coordination simple at the current stage.
4.3 Key Technology Decisions¶
Decision |
Choice |
Reason |
|---|---|---|
Web framework |
FastAPI |
Async, automatic OpenAPI, Pydantic validation |
Database |
PostgreSQL (one schema per context) |
ACID guarantees, rich query support, familiar tooling |
ORM / query layer |
SQLAlchemy 2 (async) |
Pythonic, supports async, works well with FastAPI |
Migrations |
Alembic |
Standard tool for SQLAlchemy projects |
Frontend |
React + TypeScript |
Type-safe UI, large ecosystem |
Auth |
JWT (RS256) |
Stateless, verifiable across services without shared DB |
4.4 How the Strategy Meets the Quality Goals¶
Quality Goal |
How it is addressed |
|---|---|
Availability |
Stateless services allow restarts and rolling updates without downtime |
Performance |
Async handlers + connection pooling keep latency low under load |
Scalability |
Each context scales independently; no shared mutable state |
Security |
RS256 JWTs; each context validates tokens locally |
Maintainability |
Hard context boundaries enforced by separate schemas and API contracts |