Antworten:
JMS (ActiveMQ ist eine JMS-Broker-Implementierung) kann als Mechanismus verwendet werden, um die asynchrone Anforderungsverarbeitung zu ermöglichen. Möglicherweise möchten Sie dies tun, weil die Bearbeitung der Anfrage lange dauert oder weil mehrere Parteien an der eigentlichen Anfrage interessiert sein könnten. Ein weiterer Grund für die Verwendung besteht darin, mehreren Clients (möglicherweise in verschiedenen Sprachen geschrieben) den Zugriff auf Informationen über JMS zu ermöglichen. ActiveMQ ist hier ein gutes Beispiel, da Sie das STOMP-Protokoll verwenden können, um den Zugriff von einem C # / Java / Ruby-Client aus zu ermöglichen.
Ein Beispiel aus der Praxis ist eine Webanwendung, mit der eine Bestellung für einen bestimmten Kunden aufgegeben wird. Im Rahmen der Bestellung (und Speicherung in einer Datenbank) möchten Sie möglicherweise eine Reihe zusätzlicher Aufgaben ausführen:
Zu diesem Zweck veröffentlicht Ihr Anwendungscode eine Nachricht in einer JMS-Warteschlange, die eine Bestell-ID enthält. Ein Teil Ihrer Anwendung, der die Warteschlange abhört, reagiert möglicherweise auf das Ereignis, indem er die orderId nimmt, die Bestellung in der Datenbank nachschlägt und diese Bestellung dann bei einem anderen Drittanbieter-System aufgibt. Ein anderer Teil Ihrer Anwendung ist möglicherweise dafür verantwortlich, die Bestell-ID entgegenzunehmen und eine Bestätigungs-E-Mail an den Kunden zu senden.
Verwenden Sie sie ständig, um lang laufende Vorgänge asynchron zu verarbeiten. Ein Webbenutzer möchte nicht länger als 5 Sekunden auf die Verarbeitung einer Anforderung warten. Wenn Sie eine haben, die länger läuft, besteht ein Entwurf darin, die Anforderung an eine Warteschlange zu senden und sofort eine URL zurückzusenden, die der Benutzer überprüfen kann, um festzustellen, wann der Auftrag abgeschlossen ist.
Publish / Subscribe ist eine weitere gute Technik, um Sender von vielen Empfängern zu entkoppeln. Es ist eine flexible Architektur, da Abonnenten nach Bedarf kommen und gehen können.
Ich hatte so viele erstaunliche Anwendungen für JMS:
Web-Chat-Kommunikation für den Kundenservice.
Debug-Protokollierung im Backend. Alle App-Server sendeten Debug-Nachrichten auf verschiedenen Ebenen. Ein JMS-Client könnte dann gestartet werden, um nach Debug-Nachrichten zu suchen. Sicher, ich hätte so etwas wie Syslog verwenden können , aber dies gab mir alle möglichen Möglichkeiten, die Ausgabe basierend auf Kontextinformationen zu filtern (Gleichung nach App-Servername, API-Aufruf, Protokollstufe, Benutzer-ID, Nachrichtentyp usw.). Ich habe auch die Ausgabe eingefärbt.
Debug-Protokollierung in Datei. Wie oben wurden nur bestimmte Teile mithilfe von Filtern herausgezogen und zur allgemeinen Protokollierung in einer Datei protokolliert.
Alarmieren. Wieder ein ähnliches Setup wie bei der obigen Protokollierung, bei dem nach bestimmten Fehlern gesucht und Personen auf verschiedene Weise benachrichtigt werden (E-Mail, Textnachricht, IM, Growl-Popup ...).
Dynamische Konfiguration und Steuerung von Software-Clustern. Jeder App-Server sendet eine "configure me" -Nachricht und anschließend einen Konfigurationsdämon, der mit einer Nachricht antwortet, die alle Arten von Konfigurationsinformationen enthält. Wenn später alle App-Server ihre Konfigurationen gleichzeitig ändern mussten, kann dies über den Konfigurationsdämon erfolgen.
Und die üblichen Transaktionen in der Warteschlange für verzögerte Aktivitäten wie Abrechnung, Auftragsabwicklung, Bereitstellung, E-Mail-Generierung ...
Es ist überall dort großartig, wo Sie die asynchrone Zustellung von Nachrichten garantieren möchten.
Verteiltes (a) synchrones Rechnen.
Ein Beispiel aus der Praxis könnte ein anwendungsweites Benachrichtigungsframework sein, das im Verlauf der Anwendungsnutzung an verschiedenen Stellen E-Mails an die Stakeholder sendet. Die Anwendung würde also als Objekt fungieren , indem sie Producer
ein Message
Objekt erstellt, es auf ein bestimmtes Objekt legt Queue
und sich vorwärts bewegt.
Es würde eine Reihe von Consumer
s geben, die die Queue
fraglichen abonnieren und sich um die Übermittlung kümmern würden Message
. Beachten Sie, dass im Verlauf dieser Transaktion die Producer
s von der Logik entkoppelt werden, wie ein gegebenes behandelt werden Message
würde.
Messaging-Frameworks (ActiveMQ und dergleichen) fungieren als Rückgrat, um solche Message
Transaktionen durch Bereitstellung von MessageBroker
s zu erleichtern .
Ich habe es verwendet, um Intraday-Trades zwischen verschiedenen Fondsmanagementsystemen zu senden. Wenn Sie mehr darüber erfahren möchten, was ein großartiges Technologie-Messaging ist, kann ich das Buch " Enterprise Integration Patterns " uneingeschränkt empfehlen . Es gibt einige JMS-Beispiele für Dinge wie Anfordern / Antworten und Veröffentlichen / Abonnieren.
Messaging ist ein hervorragendes Werkzeug für die Integration.
Wir verwenden es, um eine asynchrone Verarbeitung zu initiieren, die wir nicht unterbrechen oder mit einer vorhandenen Transaktion in Konflikt bringen möchten.
Angenommen, Sie haben eine teure und sehr wichtige Logik wie "Sachen kaufen". Ein wichtiger Teil von Sachen kaufen wäre "Benachrichtigen". Wir machen den Benachrichtigungsaufruf asynchron, damit die Logik / Verarbeitung, die an dem Benachrichtigungsaufruf beteiligt ist, die Ressourcen der Kaufgeschäftslogik nicht blockiert oder mit ihnen konkurriert. Endergebnis, Kauf abgeschlossen, Benutzer ist zufrieden, wir erhalten unser Geld und da die Lieferung der Warteschlange garantiert ist, wird das Geschäft benachrichtigt, sobald es geöffnet wird oder sobald sich ein neuer Artikel in der Warteschlange befindet.
Ich habe es für mein akademisches Projekt verwendet, bei dem es sich um eine Online-Einzelhandels-Website handelt, die Amazon ähnelt. JMS wurde verwendet, um folgende Funktionen zu handhaben:
Wir hatten mehrere auch implementierte Remote-Clients, die mit dem Hauptserver verbunden waren. Wenn eine Verbindung verfügbar ist, greifen sie auf die Hauptdatenbank zu oder verwenden keine eigene Datenbank. Um die Datenkonsistenz zu gewährleisten, hatten wir einen 2PC-Mechanismus implementiert. Zu diesem Zweck haben wir JMS verwendet, um die Nachrichten zwischen diesen Systemen auszutauschen, dh eines als Koordinator, der den Prozess durch Senden einer Nachricht in der Warteschlange initiiert, und andere reagieren entsprechend, indem sie erneut eine Nachricht in der Warteschlange zurücksenden. Wie andere bereits erwähnt haben, war dies dem Pub / Sub-Modell ähnlich.
Ich habe JMS in verschiedenen kommerziellen und akademischen Projekten gesehen. JMS kann leicht in Ihr Bild kommen, wenn Sie ein vollständig entkoppeltes verteiltes System wünschen. Im Allgemeinen, wenn Sie Ihre Anfrage von einem Knoten aus senden müssen und jemand in Ihrem Netzwerk sich darum kümmert, ohne dem Absender Informationen über den Empfänger zu geben.
In meinem Fall habe ich JMS bei der Entwicklung einer nachrichtenorientierten Middleware (MOM) in meiner Diplomarbeit verwendet, bei der bestimmte Arten objektorientierter Objekte auf einer Seite als Ihre Anforderung generiert und auf der anderen Seite als Ihre Antwort kompiliert und ausgeführt werden .
Apache Camel, das in Verbindung mit ActiveMQ verwendet wird, ist eine hervorragende Möglichkeit, Enterprise Integration Patterns zu erstellen
Wir verwenden JMS für die Kommunikation mit Systemen an einer Vielzahl von Remote-Standorten über unzuverlässige Netzwerke. Die lose Kopplung in Kombination mit zuverlässigem Messaging erzeugt eine stabile Systemlandschaft: Jede Nachricht wird gesendet, sobald es technisch möglich ist, größere Netzwerkprobleme haben keinen Einfluss auf die gesamte Systemlandschaft ...