01Event-carried projections over request-time fan-out
Request-time fan-out from the recommendation endpoint to catalog and engagement turns one read into a chain of availability requirements. Kafka projections move the coupling to the write side, so recommendation queries read from local state only.
02Catalog-owned book progress over engagement-owned progress
Keeping book progress in engagement splits the write path from the screen that the user expects to refresh immediately. Catalog now writes and reads book progress canonically, while engagement consumes the same events to build chronological history.
03Recommendation-service as local vector read model
Pulling ranking candidates from operational schemas ties recommendation latency to foreign table shape and query load. A dedicated read model lets recommendation-service store embeddings, profiles, interacted-book filters, and denormalized response data locally.
04Gateway as single ingress over direct client-to-service access
Direct client access to every service duplicates authentication, rate limiting, and routing policy across multiple edges. Gateway-service centralizes those concerns and keeps the external surface smaller.