Profesní
Order Store Service
Přehled
Order Store Service udržoval konsolidovaný pohled na objednávky sestavený z událostí produkovaných více systémy, včetně vytvoření objednávky, plateb, přiřazení dopravce, rezervace skladu, reklamací, dokumentů a změn zákaznických údajů. REST API zpřístupňovalo takto nasbíraný stav, zatímco asynchronní workflow vyhodnocovala, zda už dorazilo dost informací pro pokračování dalšího zpracování. Výrazně jsem přispíval k rozvoji služby, včetně workflow pro autorizaci objednávky k vychystání, logistického a zákaznického obohacování dat, databázového řízení souběhu, optimalizace EF Core a SQL a infrastruktury pro integrační testování asynchronních toků.
Moje role
- Implementoval jsem hlavní end-to-end workflow pro autorizaci objednávky k vychystání, které zpracovávalo příkazy, ukládalo stav připravenosti, validovalo požadovaná data objednávky a po splnění všech podmínek publikovalo OrderAuthorizedForPickingEvent.
- Vytvořil a rozšiřoval jsem obohacování objednávek o data z událostí týkajících se dopravce, pickup pointů, doručení, picking instrukcí, rezervace skladu a odhadů plateb včetně perzistence, mappingu a integračních testů.
- Implementoval jsem lokální projekci zákazníka aktualizovanou událostmi a synchronní fallback do Online služby v případech, kdy požadovaná zákaznická data ještě nebyla dostupná lokálně.
- Navrhl jsem databázové locking mechanismy pro souběžné zpracování událostí nad stejnými objednávkami a zákazníky napříč více instancemi služby.
- Optimalizoval jsem výkon EF Core a SQL Serveru pomocí split a no-tracking query cest, úprav repository vrstvy, indexace a odstranění nákladného ORM chování.
- Rozšířil jsem komplexní zpracování reklamací a vratek pro bundle produkty, náhrady a vztahy mezi původními a generovanými položkami objednávky.
- Vytvořil a stabilizoval jsem testovací infrastrukturu pro asynchronní consume-and-publish workflow, včetně fake publisherů a synchronizace kolem publikovaných událostí.
- Provedl jsem migraci celého solution na .NET 6, včetně aplikačních projektů, testů, Docker runtime konfigurace a CI/CD.
Architektura a technologie
- ASP.NET Core REST API zpřístupňující perzistentní projekce objednávek, customer orders a historie
- Event-driven consumers zpracovávající příkazy a integrační události přes Oriflame messaging platformu nad Azure Service Bus
- EF Core se SQL Serverem pro ukládání projekcí objednávek, stavů, logistických dat, zákaznických informací, plateb, dokumentů a synchronizačního stavu
- Event Hub publishers pro publikování navazujících událostí pro objednávky a warehouse-management systémy
- Vyhodnocování připravenosti na základě uložených stavů přijatých eventů a commandů před publikováním závislých navazujících událostí
- Databázové order a customer locky pro koordinaci souběžného zpracování napříč horizontálně škálovanými instancemi služby
- Polly-based retry policies s předáním neúspěšných zpráv do dead-letter queue messaging platformy
- Application Insights telemetry, audit logging, health checks a deployment do AKS přes Azure DevOps a GitOps
Technické výzvy
- Sestavit konzistentní projekci objednávky z událostí přicházejících nezávisle, potenciálně v různém pořadí a z více upstream systémů.
- Určit, kdy už bylo nasbíráno dost distribuovaného stavu pro bezpečnou autorizaci objednávky k vychystání bez závislosti na jednom synchronním requestu.
- Zpracovat více událostí pro stejnou objednávku nebo zákazníka souběžně napříč horizontálně škálovanými instancemi služby.
- Udržet stále bohatší graf objednávky výkonný i s rostoucím množstvím uložených vazeb a požadavků na API retrieval.
- Zpracovat nekompletní nebo volitelné části event payloadů a zároveň zachovat dostatek stavu pro downstream publishing a API consumerům.
- Deterministicky testovat asynchronní workflow, kde zpracování jedné zprávy může vést k databázovým změnám a následnému publikování dalších událostí.
Rozhodnutí a kompromisy
- Ukládat přijaté eventy a commandy jako explicitní stav objednávky a vyhodnocovat připravenost nad tímto nasbíraným stavem. Downstream akce tak mohly čekat na požadované informace bez nutnosti spojovat upstream systémy do synchronního orchestračního řetězce.
- Použít databázové order a customer locky místo process-local synchronizace. Protože služba běžela ve více instancích v AKS, koordinace musela fungovat napříč procesy.
- Ukládat obohacená data objednávky, jako jsou údaje o dopravci, pickup pointu, skladu, platbách a zákazníkovi, lokálně. Projekce objednávky tak byla použitelná pro API i downstream publishery bez nutnosti opakovaně dotazovat všechny zdrojové služby.
- Použít synchronní fallback do Online služby pouze v případě, že požadovaná zákaznická data chyběla v lokální event-driven projekci. Běžný asynchronní tok tak zůstal zachovaný a zároveň existovala cesta pro doplnění nekompletního stavu.
- Optimalizovat sdílené EF Core repository cesty pomocí split queries, no-tracking čtení a cílených indexů místo spoléhání na implicitní ORM loading. Tím se snížilo množství zbytečné práce nad databází u rozsáhlých order grafů.
- Vytvořit specializovanou test publisher infrastrukturu, aby integrační testy mohly přímo sledovat asynchronně publikované události a ověřovat celé consume-persist-publish workflow.
Výsledky a přínos
- Dodal event-driven workflow pro autorizaci vychystání, které propojovalo příjem zpráv, perzistentní stav připravenosti, zákaznické a logistické obohacení, konstrukci downstream události a její publikování.
- Rozšířil projekci objednávky o logistická, platební, zákaznická a skladová data potřebná pro API a navazující fulfillment procesy.
- Zvýšil spolehlivost souběžného zpracování událostí pomocí databázové koordinace nad objednávkami a zákazníky.
- Zlepšil charakteristiky databázového přístupu pomocí optimalizace EF Core queries, návrhu indexů a úprav repository vrstvy.
- Doplnil regression coverage pro komplexní scénáře objednávek, včetně vratek bundle produktů, náhrad a asynchronního publikování událostí.
- Posílil technický základ služby pomocí znovupoužitelné infrastruktury pro asynchronní integrační testy, produkční observability a migrace celého solution na .NET 6.