Profesní projekt
Logistics Order Service
Přehled
High-throughput služba pro zpracování logistických objednávek navržená pro spolehlivé změny dat a resilient event-driven workflow. Kombinuje Dapper-based data access, messaging přes Azure Service Bus a Kafka, durable background tasks a New Relic observability.
Moje role
- Vyvíjel jsem spolehlivý messaging a background processing pro .NET logistickou službu.
- Vybudoval jsem znovupoužitelnou infrastrukturu pro Azure Service Bus publishing a consumers založenou na CloudEvents.
- Implementoval jsem SQL-backed persistent-task framework s durable state, retries a recovery.
- Migroval jsem tým z vlastní Kafka integrace na company-standard messaging library a pomohl stabilizovat její počáteční rollout.
- V reliability-critical data-access paths jsem používal Dapper s explicitní správou transakcí.
Architektura a technologie
- .NET služba pro zpracování logistických objednávek
- Dapper-based data access s explicitními transaction boundaries
- Azure Service Bus publishers a consumers využívající CloudEvents
- Dynamické CloudEvent type resolution a dispatch do typed handlers
- Kafka integrace přes company-standard Notino.Messaging library
- SQL-backed persistent tasks s atomic batch claiming, retries a zombie recovery
- Hangfire background processing
- Structured logs, metrics a production observability přes New Relic
Technické výzvy
- Zpracovávat vysoké objemy logistických objednávek a zároveň zachovat konzistenci mezi změnami dat a asynchronní prací.
- Bezpečně zvládat transient messaging failures bez vytváření duplicate side effects.
- Zabránit pomalým nebo chybujícím downstream consumers v blokování zpracování message topicu.
- Adoptovat novou Kafka library a zároveň řešit počáteční performance a memory issues.
Rozhodnutí a kompromisy
- Použil jsem explicitní event-type registry a typed handlers pro předvídatelné a bezpečné zpracování zpráv, kde přidání nového event type vyžaduje vědomou změnu kódu.
- Použil jsem durable tasks k oddělení message acknowledgement od pomalejšího downstream processingu, takže neúspěšnou práci lze retryovat bez blokování message consumption. Tasks a související změny databáze se ukládaly ve stejné transakci, aby se neztratila navazující práce.
- Použil jsem atomic batch claiming pro persistent tasks, aby concurrent high-throughput workers mohli pracovat bez ztráty durable task state.
Výsledky a přínos
- Spolehlivý Azure Service Bus event delivery a processing s typed CloudEvent handlers, retries, loggingem a metrics.
- Durable background-task execution s retries a recovery z opuštěných nebo zombie tasks.
- Lepší correctness díky atomic task-and-data persistence a zároveň resilientnějšímu downstream processingu.
- První týmové nasazení company-standard Kafka library, včetně příspěvků ke zlepšení performance a memory během rolloutu.
- Reliability-focused a observable služba pro zpracování logistických objednávek.