Large listing datasets and expensive queries needed a read model suited to their access patterns.
02 / How I approached it
How I approached it
I separated the fast Rust serving layer, a Python fallback, cache and search/read responsibilities from transactional storage. Load balancing and request throttling controlled repeated traffic, while bulk processing and query optimization addressed expensive data operations.
System flow
Traffic control
Fast read path
Cache & search
Transactional data
What that means in practice
Architecture & decisions
01
Dedicated service, explicit data paths
The marketplace catalog became a dedicated service with its own serving architecture. Rust handled the primary fast path, with a Python fallback alongside it. I was responsible for both the architecture and its implementation, separating the catalog workload from the broader commerce application.
02
Cache, search and transactions have different jobs
Redis cached data for repeated reads, while Elasticsearch provided the search/read model and PostgreSQL retained transactional responsibilities. This separated how catalog data was retrieved from how business state was stored. Bulk operations and heavy-query optimization complemented that division of responsibilities.
03
Control repeated traffic at the boundary
Load balancing and throttling were part of the service design. Clients making excessive repeated requests could be slowed before their traffic dominated the catalog workload. Traffic controls, caching and the fast serving layer were designed together, addressing both how requests arrived and how the underlying data was read.
03 / The outcome
The outcome
Search and high-frequency reads gained their own path while transactional storage and business logic retained separate responsibilities.