zpět na Všechny projekty

Profesní

Camunda Sink

Přehled

Camunda Sink propojoval event-driven business systémy s Camunda workflow. Zpracovával nakonfigurované události z firemní messaging platformy, převáděl je na integrační vzory specifické pro Camundu a řešil korelaci, retries, timeouty, tenant pravidla a reprocessing selhaných událostí. Výrazně jsem přispíval k architektuře a dalšímu rozvoji služby, včetně restrukturalizace projektů, dynamické konfigurace, registrace handlerů, multi-tenant chování, back-office nástrojů, asynchronního global-message processingu, zvýšení spolehlivosti a modernizace platformy.

Moje role

  • Restrukturalizoval jsem službu do samostatných API, application, consumer, data a worker projektů a přidal Web API pro provozní konfiguraci.
  • Implementoval jsem konfiguraci eventů uloženou v Azure Blob Storage s automatickým pollingem a reloadem při změně, což umožnilo upravovat event routing bez redeploymentu služby.
  • Vytvořil jsem dynamickou registraci event handlerů a handler factory schopnou směrovat nakonfigurované event typy na correlation-message, signal nebo global-message processing.
  • Rozšířil jsem Camunda integraci o asynchronní global-message processing, který aktualizoval proměnné napříč přihlášenými process instances a sledoval dokončení Camunda batch operací.
  • Implementoval jsem tenant-aware zpracování eventů a konfigurovatelné potlačení zpracování pro vybrané tenanty, včetně API, back-office a audit logiky.
  • Zvýšil jsem spolehlivost pomocí rozdílných Polly retry policies, timeout handlingu, circuit-breaker chování a bezpečnějšího ukládání a reprocessingu selhaných událostí.
  • Vytvořil jsem Blazor back-office aplikaci a generovaného API klienta pro prohlížení a správu konfigurace zpracovávaných eventů.
  • Implementoval jsem maintenance službu pro čištění expirovaných záznamů v Dead Events Storage a souvisejících blobů, včetně integračních testů nad Azurite a podpory CI/CD.
  • Migroval jsem multi-project službu a související deployment tooling na .NET 7.

Architektura a technologie

  • .NET worker services zpracovávající business eventy a commandy přes Ori.Messaging nad Azure Service Bus
  • ASP.NET Core Web API pro prohlížení a úpravu konfigurace zpracovávaných eventů
  • Dynamická event handler factory podporující Camunda correlation messages, signals a global variable updates
  • Integrace přes Camunda OpenAPI klienta pro message correlation, signal delivery a asynchronní batch aktualizace process variables
  • Runtime konfigurace uložená v Azure Blob Storage s detekcí změn pomocí ETag a propagací změn přes IOptionsMonitor
  • Azure Table Storage, Blob Storage a Queue Storage pro ukládání a reprocessing selhaných eventů
  • Polly retry a circuit-breaker policies s chováním přizpůsobeným jednotlivým integračním scénářům
  • Server-side Blazor back-office UI s generovaným API klientem
  • Application Insights telemetry, audit logging, Docker a Azure DevOps CI/CD

Technické výzvy

  • Směrovat velké množství event typů do různých Camunda integračních vzorů a přitom zachovat chování konfigurovatelné bez velkého množství event-specific infrastruktury.
  • Aplikovat změny konfigurace za běhu bez redeploymentu služby a bez ponechání consumerů registrovaných se zastaralými definicemi handlerů.
  • Zpracovat Camunda operace s velmi rozdílnými charakteristikami – od synchronních correlation messages až po dlouhotrvající signals a asynchronní batch aktualizace.
  • Vyhnout se nebezpečným retries v situacích, kdy Camunda mohla pokračovat ve zpracování i po timeoutu a opakovaný request by mohl způsobit duplicitní side effects.
  • Podporovat multi-tenant zpracování eventů a zároveň umožnit dynamicky potlačit zpracování pro vybrané tenanty na úrovni konfigurace.
  • Uchovat data o selhaných eventech pro analýzu a reprocessing a zároveň bezpečně řídit životní cyklus metadat a souvisejících blob payloadů.

Rozhodnutí a kompromisy

  • Modelovat zpracování eventů pomocí konfigurovatelných handler typů namísto samostatných hardcoded pipeline pro každý event. Handler factory na základě event typu a konfigurace zvolila correlation-message, signal nebo global-message processing.
  • Uložit konfiguraci zpracovávaných eventů do Azure Blob Storage a sledovat změny pomocí ETag. To umožnilo provozní změny routingu bez rebuildování nebo redeploymentu služby.
  • Při změně konfigurace restartovat a znovu registrovat event consumery namísto pokusu měnit aktivní registrace handlerů za běhu. Runtime chování tak zůstalo synchronizované s aktuální konfigurací.
  • Zpracovávat dlouhotrvající Camunda signals a global-message operace odlišně od standardních correlation messages. Některé timeout scénáře byly záměrně přesunuty do Dead Events Storage namísto automatického retry, aby se snížilo riziko duplicitního zpracování na straně Camundy.
  • Spouštět global-message delivery asynchronně a sledovat dokončení Camunda batch operací, protože aktualizace více přihlášených process instances mohla přesáhnout běžnou dobu zpracování message handleru.
  • Oddělit cleanup selhaných eventů do samostatného maintenance procesu a mazat blob payloady až po úspěšném odstranění odpovídajících metadat ze storage, čímž se snížilo riziko nekonzistentního cleanupu.

Výsledky a přínos

  • Umožnil konfiguračně řízené směrování business eventů do několika různých Camunda integračních vzorů.
  • Umožnil měnit konfiguraci zpracovávaných eventů za běhu prostřednictvím Blob Storage-backed konfigurace a dynamické re-registrace consumerů.
  • Rozšířil integraci nad rámec přímé message correlation o tenant-aware signals a asynchronní aktualizace process variables.
  • Zvýšil produkční spolehlivost pomocí retry, timeout a failed-event handlingu přizpůsobeného různým typům Camunda operací.
  • Poskytl interní provozní nástroje pro prohlížení a správu event konfigurace prostřednictvím Web API a Blazor back office.
  • Doplnil lifecycle management pro failed-event storage prostřednictvím samostatné maintenance služby s integračními testy.
  • Modernizoval architekturu a runtime služby prostřednictvím restrukturalizace projektů a migrace na .NET 7.