5 Stimmen

Ansatz zur Behandlung von lang laufenden Prozessen mit Camel

Ich arbeite an einem Proof of Concept für einen kleinen Prozess-Engine basierend auf Camel. Die Anforderungen sind, die Fähigkeit zu haben, eine Reihe von konsekutiven Schritten auszuführen und jeder von ihnen könnte potenziell Stunden dauern. Ein asynchroner Kommunikationsstil ist in diesem Fall die offensichtliche Wahl, aber ich habe Schwierigkeiten, den "Prozess"-Teil richtig zu gestalten.

Beim Senden einer Nachricht an ein externes System muss ich auf die Fertigstellung warten. Da dies viel Zeit in Anspruch nehmen könnte, überlege ich, die Verarbeitung des konkreten Schrittes anzuhalten, nachdem ich die Nachricht gesendet habe, und dann einen neuen "Job" zu starten, sobald ich die Abschlussnachricht zurückbekomme. So wird die Verarbeitung jedes Schrittes buchstäblich als Camel-Route behandelt, die an derselben JMS-Warteschlange beginnt, und dann entscheidet ein inhaltsgesteuerter Router, welche konkrete Logik basierend auf den Headern der Nachricht oder deren Inhalt ausgeführt werden soll.

Das Problem besteht jedoch darin, wie man das Risiko von Nachrichtenverlust vermeiden kann. Zum Beispiel sende ich an einem konkreten Schritt eine Nachricht und stoppe die Verarbeitung. Das externe System hat aus irgendeinem Grund die Nachricht nicht verarbeitet, sodass mein System keine Benachrichtigung erhält. Das bedeutet, dass der Prozess stecken bleibt, es sei denn, ein anderes Komponent erzeugt eine Nachricht, um ihn zu reaktiveren.

Da das System jederzeit heruntergefahren werden könnte, muss ich Logik einbauen, um die Verarbeitung von Nachrichten nach einem Neustart fortzusetzen (was eine Art von Nachrichtendurchsatz, Wiederholung und Transaktionsverwaltungsstrategie impliziert).

All diese Probleme häufen sich, daher möchte ich die erfahrenen Camel-Champions bitten, Vorschläge zu machen, wie man eine solche Art von Logik mit Camel entwerfen kann. Ich weiß, dass ein dediziertes BPM-Produkt oder ein ESB dieses Problem viel einfacher lösen könnte, aber ich möchte die Lösung nicht aufblähen.

Alle Ratschläge sind willkommen, insbesondere in Bezug auf die Möglichkeiten von Camel, die zur Vereinfachung der Lösung beitragen könnten.

2voto

Ben ODay Punkte 20366

Camel's BAM Support sollte Ihnen einige der Support für langlaufende Prozesse (Timeouts, Fehlerbehandlungsszenarien usw.) bieten. Auch JMS und Transaktionen werden bei zuverlässigen/dauerhaften Messaging-Anforderungen helfen.

viel Glück und lassen Sie es uns wissen, wenn Sie einen alternativen Ansatz finden...

2voto

Ed Ost Punkte 1399

Ich würde vorschlagen, dass das Claim Check-Muster am besten geeignet ist, um den Zustand zwischen lang laufenden externen Aufrufen beizubehalten. Überprüfen Sie den Zustand Ihres Prozesses, bevor Sie die ausgehende Nachricht senden.

Ein Weg, um das Nicht-Antworten des externen Prozesses zu erkennen, ist das Posten von zwei Nachrichten. Eine Nachricht geht an den externen Prozess, eine andere geht an eine interne Warteschlange. Ich nenne die zweite die Prozess-Timeout-Nachricht. Es ist eine sehr kleine Nachricht mit nur der Korrelations-ID und einer geeigneten Ablaufzeit. Wenn der Prozess vom externen Prozess empfangen wird, wird der empfangende Prozess die Korrelations-ID haben und die Nachricht aus der Prozess-Timeout-Warteschlange entfernen können. Wenn der externe Prozess nicht antwortet, sollte die Dead-Letter-Warteschlange für die Prozess-Timeout-Warteschlange mit einer Kamelroute verbunden sein, die einen Administrator benachrichtigt oder geeignete automatische Maßnahmen ergreift, z. B. das Abrufen des Claim Checks usw. Dadurch wird ein persistenter Zustand mit minimalem Overhead und ohne BPM-Tool und somit keinem Single Point of Failure ermöglicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X