Übung 08
Ziel dieser Ausarbeitung ist ein vollständiges Architektur-Design in Xentral Connect, das alle Anforderungen (Lagerbestands-Sync, Order-Import, Versand-Rückmeldung, Fehlerbehandlung) abdeckt. Die Architektur folgt Prinzipien der Entkopplung, Skalierbarkeit, Wiederverwendbarkeit und robuster Fehlerbehandlung.
1) Architekturbeschreibung (Übersicht)
Gesamtstruktur: 5 voneinander getrennte Workflows in Xentral Connect, dazu ein gemeinsamer Error-Handling-Workflow und ein kleiner Hilfs-Workflow für wiederverwendbare Dienste (z.B. RateLimiter/Queue-Controller).
Workflows (kurz):
Stock Sync Workflow (Timer)
Order Import Workflow (Webhook)
Shipment Notification Workflow (Event)
Error Handling Workflow (Error Trigger)
Shared Services Workflow (Rate Limiting / Retry Queue / Lookup Cache) — optional als Hilfs-Workflow
Warum mehrere Workflows?
Entkopplung: einzelne Verantwortlichkeiten erleichtern Wartung & Tests.
Fehlerisolation: Fehler in einem Prozess betreffen nicht andere.
Skalierung: Stock Sync kann unabhängig skaliert/batched / throttled werden.
Wiederverwendbarkeit: Shared Services (RateLimiting, Cache) von mehreren Workflows nutzbar.
Interaktion und Trigger:
Stock Sync: Timer-Trigger alle 15 Minuten.
Order Import: Webhook-Trigger (Marktplatz -> Xentral) für Near-Realtime.
Shipment Notification: Event-Trigger auf Xentral-Ereignis (deliverynote.created).
Error Handling: Error-Trigger, der Fehlkontexte empfängt.
Shared Services: Invoked via HTTP-Invoke oder interner Aufruf/Kanal.
Besondere Strategien:
Performance: nur geänderte Artikel synchronisieren (modified > letzter Lauf). Batch-Größen = 100, benutze Marktplatz-Batch-Endpunkt. Parallelisierung mit begrenzter Workeranzahl, respektiere API-Limit (RateLimiter).
API-Limitführung: zentraler RateLimiter-Service trackt Anfragen/Stunde; Stock Sync plant Batch-Aufrufe so, dass 1000/h nicht überschritten werden.
SKU-Mapping: zentrale Transformations-Funktion / Mapping-Knoten (entfernt
MP-Präfix).Customer-Lookup: zuerst Suche in Xentral via USt-IdNr; beim Nicht-Fund: create-customer.
Fehlerbehandlung: try/catch-Pattern innerhalb Workflows → bei Fehlern: Trigger an Error-Handling-Workflow mit vollständigem Input, Stack-Trace, Metadaten; persistiere fehlerhaften Payload in einem Data Store (z.B. S3 / Blob / DB).
Observability: strukturierte Logs, korrelations-IDs (z. B. trace_id pro Bestellung / Batch), Monitoring-Metriken (anzahl Fehler, Latenz, API-Nutzung).
2) Detaillierte Workflow-Pläne (Schritt-für-Schritt)
Hinweis: Jeder Workflow listet die Kernlogik und die wichtigsten Knoten in Xentral Connect (Trigger, HTTP, Function, If, Error-Trigger, Data Store, Slack).
Stock Sync Workflow (Timer-Trigger, alle 15 Minuten)
Zweck: Lagerbestände von Xentral → Marktplatz in effizienten Batches aktualisieren.
Kernschritte:
Trigger: Timer (alle 15 Min).
State/Kontext lesen: letzten Sync-Timestamp aus Data Store holen (z. B. KV oder DB).
Query Xentral:
article.listmit Filtermodified > last_run_timestamp(falls Xentral das unterstützt) — sonst Änderungsspur / delta endpoint nutzen.Knoten: HTTP-Request / Xentral-Connector
Wenn Ergebnis leer: update last_run_timestamp und Ende.
Normalisieren & Filter: nur aktive Artikel, nur relevante Lagerorte, berechne verfügbare Menge (available = total - reserved).
Knoten: Function / Transform
Gruppieren in Batches à 100 Artikel.
Knoten: Function (chunk array into 100s)
RateLimit-Planung: Bestimme erlaubte parallele Batch-Aufrufe basierend auf verbleibendem API-Budget (RateLimiter-Service abfragen).
Knoten: HTTP-Invoke RateLimiter / Function
Für jeden Batch:
Build Marktplatz-Batch-Payload.
HTTP-Request zu Marktplatz Batch-Endpunkt (1 Request aktualisiert bis zu 100 SKUs).
On HTTP-Error: Retry-Strategie mit expon. Backoff (max N), bei dauerhaften Fehlern send Error-Trigger an Error-Handling-Workflow inkl. batch payload.
Nach erfolgreichem Durchlauf: update last_run_timestamp (= Startzeit dieses Laufs).
Metriken/Logs: Anzahl verarbeiteter Artikel, API-Anfragen gezählt, Laufzeit.
Wichtige Knoten: Timer Trigger, HTTP-Request (Xentral), Function (chunk/transform), Parallel-Runner begrenzt, HTTP-Request (Marktplatz), Data Store (KV), Error Trigger.
Throttling-Strategie:
Max 1000 Anfragen/h → bei Batch-Größe 100 benötigen wir max 10 Requests pro 1000 Artikel. Für 5000 Artikel also 50 Requests pro kompletten Sync; das ist innerhalb des Limits, aber wir planen trotzdem kontrollierte Parallelität und einen Safety-Puffer.
RateLimiter-Service verwaltet ein Token-Bucket. Stock Sync fragt vor Batch-Aufruf ein Token-Set an.
Order Import Workflow (Webhook-Trigger, Echtzeit)
Zweck: Neue Marktplatz-Bestellungen in Xentral anlegen.
Kernschritte:
Trigger: Webhook (Marktplatz sendet Bestellung).
Korrelations-ID erzeugen (trace_id) und Log-Eintrag.
Validierung: Schema-Validation der Bestellung (relevante Felder vorhanden: customer, items, total, invoiceAddr, vatId, external_order_id).
On validation fail → Error-Trigger (mit Payload).
Customer Lookup:
Extract USt-IdNr. (VAT id) aus Bestellung.
Query Xentral:
customer.listfilter by USt-IdNr.If found: use existing customer_id.
Else: create customer via
customer.create(mapping der Felder).Knoten: HTTP-Request (Xentral), If node, HTTP-Request create.
On create-failure → Error-Trigger.
Items / SKU-Mapping:
Für jedes order-item: remove
MP-prefix (e.g.MP-1234→1234).Option: Validiere SKU existiert in Xentral via
article.getoderarticle.list(batch lookup).Wenn eine SKU unbekannt:
Markiere Artikel als unknown.
Entweder: a) Versuch Auto-Match via EAN/Name, b) Fail the order.
Bei Fehlschlag → Error-Trigger (inkl. original order payload).
Build Xentral Order Payload (positions, customer_id, payment/shipping, external ids, Marktplatz-Metadaten).
Create Order in Xentral:
order.create(oder passende endpoint).On success: ack to Marktplatz falls erforderlich (HTTP 200 to webhook origin or explicit API).
Post-Processing:
Set a flag on created order (custom field) wie
origin: marketplaceundmarketplace_order_id.Emit Trace-Event / Log.
Error handling:
Alle Fehler (invalid data, unknown SKU, customer create fail) → call Error-Handling Workflow (Error-Trigger) with full context and persisted payload.
Wichtige Knoten: Webhook Trigger, JSON Schema Validator, Function (sku mapping), HTTP-Request Xentral (customer, article check, create order), If, Parallel batch SKU-check, Error Trigger.
Optimierung:
Batch-SKU-Checks in Gruppen (z. B. 50 per request) um Xentral-API-Calls zu reduzieren.
Local cache (Shared Services) für SKU lookups und VAT lookups (TTL z. B. 5 min – 1 h).
Shipment Notification Workflow (Event-Trigger: deliverynote.created)
Zweck: Sobald ein Lieferschein in Xentral für einen Marktplatz-Auftrag erstellt wird, Marktplatz informieren (versendet + Tracking).
Kernschritte:
Trigger: Event Listener auf Xentral-Ereignis
deliverynote.createdoder Polling aufdeliverynote.listmit recent new flag.Payload-Validierung: prüfe, ob zugehöriger Auftrag
origin: marketplaceoder custom fieldmarketplace_order_idexistiert.If not marketplace-origin → End (ignorieren).
Extrahiere tracking-number, carrier, marketplace_order_id.
Build Marktplatz-Payload (order id + tracking + carrier + shipped flag).
HTTP-Request: Marktplatz API → mark shipment as shipped.
On success: log & update Xentral order (set metadata shipped_confirmed:true).
On failure:
Retry (expon. backoff).
Bei dauerhaften Fehlern send Error-Trigger (inkl. deliverynote payload).
Optional: send confirmation to ERP user via Slack/Email on critical failure.
Wichtige Knoten: Event Trigger, If (check origin), Function (transform), HTTP-Request to Marktplatz, Error Trigger.
Realtime-Anforderung: Event-Trigger ist bevorzugt; falls nicht verfügbar, Polling mit sehr kurzen Intervallen (z. B. 1–2 Minuten) wäre fallback.
Error Handling Workflow (Error-Trigger)
Zweck: Zentrale Verarbeitung und Persistierung aller Fehler aus anderen Workflows, Benachrichtigung an Slack, Persistenz der fehlerhaften Payloads.
Kernschritte:
Trigger: Error-Trigger (Workflows senden hier standardisierte Fehlernachrichten).
Fehler-Payload enthält: trace_id, workflow_name, step_name, error_message, stack, original_payload, retries, timestamp.
Persistieren:
Speichere Original-Payload + Fehler-Metadaten in persistentem Storage (z. B. S3/Blob/DB) unter generischer Pfadstruktur (workflow/date/trace_id.json).
Falls Storage fehlschlägt: Fallback in DB.
Klassifizieren:
Error-Typ bestimmen: transient vs permanent vs data_error.
Bei transient: optional re-queue in Retry-Queue (Shared Services) mit Rate-limit/backoff.
Notify Slack:
Formatierte Nachricht an Slack Incoming Webhook:
Kurzinfo: Workflow + Error.
Details: trace_id, error_message, link to stored payload, timestamp, suggested action.
Option: attach small excerpt of payload (truncate).
Escalation:
Bei recurring errors (z. B. same error > N times in T interval) → send to escalation channel / create ticket.
Metrics & Logging: increment error counters, expose for monitoring.
Wichtige Knoten: Error Trigger, HTTP-Request (to Storage), HTTP-Request (Slack), Function (classify), Data Store.
Sicherheits- / Datenschutzhinweis: Pflege sensibler Kundeninfos beim Persistieren; falls nötig, maskiere sensible Felder bevor Speicherung oder setze eingeschränkten Storage-Zugriff.
Shared Services Workflow (Hilfs-Workflow für RateLimiter, Cache, Retry-Queue)
Zweck: Zentraler Dienst für:
Rate limiting (Marktplatz API)
Cache für SKU- und Customer-Lookups
Retry-Queue (persistente Retry-Items mit Backoff)
Kernschritte:
RateLimiter:
Exponiertes HTTP-Endpoint: callers fragen Tokens an (z. B. n tokens für n Batch-Calls).
Verwaltet ein Token-Bucket / Window für 1000 requests/h.
Antwort: allow / waitUntil (ETA) / deny.
Cache:
API: getSkuInfo(sku) → returns cached article metadata oder miss.
Cache TTL konfigurierbar.
Retry-Queue:
Aufnehmen von transient errors mit metadata (retry_count, backoff_until).
Worker (polling) verarbeitet due items und re-invokes relevant workflows.
Auth & Security:
Authentifiziere Aufrufer via API-Keys oder internen Auth.
Wichtige Knoten: HTTP-Trigger (for service calls), Data Store (counter, cache), Timer (worker), Function.
Integration:
Stock Sync benutzt RateLimiter vor jedem Batch-Aufruf.
Order Import nutzt Cache für SKU/customer lookups.
Error Handler nutzt Retry-Queue für transient retry.
3) Mermaid-Diagramm (Architektur-Visualisierung)
Füge hier ein oder mehrere Mermaid-Diagramme ein, die die Workflows, Trigger und externen Systeme zeigen.
Code (Mermaid):
(Optional: separater Sequenz- oder detailliertes Diagramm für Order Import intern mit SKU-Checks, Customer Create, Retries.)
Zusätzliche Implementierungs-Hinweise (Kurz)
Korrelations-ID: Bei jedem eingehenden Request/Webhook trace_id erzeugen und in allen nachfolgenden Requests / Logs mitschicken.
Idempotenz: Bei Erstellen von Ressourcen (Order, Customer) externe IDs/Client-Tokens verwenden, damit doppelte Webhook-Posts nicht zu Duplikaten führen.
Retries: Differenziere transient HTTP 5xx (retry) vs 4xx (data error). 4xx → ErrorWF.
Monitoring: Exportiere Metriken (prometheus-styl) für API usage, error rate, latency.
Secrets: API-Keys & Webhooks in Secret Manager / Xentral Connect Secret Store.
Tests: Unit-Tests für Transform-Funktionen (SKU Mapping), Integration-Tests für workflows mit sandbox endpoints.
Wenn du möchtest, kann ich jetzt:
a) die Mermaid-Diagramme weiter aufsplitten (z. B. detaillierter Order-Import Sequenz),
b) konkrete Beispiel-JSON-Payloads für Webhook / Batch-Requests erzeugen,
c) Xentral Connect-Knoten-Mapping in exakte Knotenfolgen (Name der Knoten) übersetzen, passend zu deiner Connect-Instanz. Welche Option bevorzugst du?
Was this helpful?
