Verwendung von JMS / Nachrichtenwarteschlangen in der Praxis? [geschlossen]

182

Ich habe gerade etwas über JMS und Apache ActiveMQ gelesen. Und haben Sie sich gefragt, für welche reale Verwendung die Leute hier JMS oder ähnliche Nachrichtenwarteschlangentechnologien verwendet haben?

nr
quelle

Antworten:

191

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:

  • Speichern Sie die Bestellung in einem Back-End-System eines Drittanbieters (z. B. SAP).
  • Senden Sie eine E-Mail an den Kunden, um ihn darüber zu informieren, dass seine Bestellung aufgegeben wurde

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.

Jon
quelle
Hallo @jon, hast du dieses Dokumentations-Tag gesehen? stackoverflow.com/documentation/jms/commit sie brauchen nur eine Committer-Unterstützung, um das Thema zu aktivieren, ich denke, Sie könnten derjenige sein :), der es ihnen ermöglicht, uns großartige Dokumente auf JMS zu geben
juanmf
@ Jon, wie ich verstehe, ist JMS selbst eine Implementierung des Unternehmensintegrationsmusters?
Valik
Nein, Maultier oder Kamel wären ...
Jon
1
Wenn eine beliebige Anzahl von Apps die Nachrichten in der Warteschlange verbraucht, woher weiß die Warteschlange dann jemals, wann alte Nachrichten gelöscht werden müssen?
Basil Bourque
95

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.

Duffymo
quelle
41
Nachdem ich Ihre Antwort gelesen habe, werde ich JMS zu meiner Warteschlange 'Was ich dieses Jahr lernen werde' hinzufügen :)
Roman
In unseren Tagen können wir anstelle der JMS-Spezifikation asynchrone Methodenaufrufe verwenden. Weitere Informationen finden Sie unter: docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html
Geo
3
Sie sind nicht ganz gleich. Bei einem asynchronen Methodenaufruf gibt es keine garantierte Zustellung. Keine Vorstellung von Themen, die an mehrere Hörer gleichzeitig gesendet werden können.
Duffymo
75

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.

Mikeomeone
quelle
5
Es erscheint mir nicht richtig, JMS für die Debug-Protokollierung zu verwenden. Warteschlangen und Messaging verursachen erhebliche Kosten, und die Protokollierung (für das Debuggen, bei dem normalerweise viele Protokolle erstellt werden) muss so schnell wie möglich erfolgen.
Marco Altieri
19

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 Producerein MessageObjekt erstellt, es auf ein bestimmtes Objekt legt Queueund sich vorwärts bewegt.
Es würde eine Reihe von Consumers geben, die die Queuefraglichen abonnieren und sich um die Übermittlung kümmern würden Message. Beachten Sie, dass im Verlauf dieser Transaktion die Producers von der Logik entkoppelt werden, wie ein gegebenes behandelt werden Messagewürde.
Messaging-Frameworks (ActiveMQ und dergleichen) fungieren als Rückgrat, um solche MessageTransaktionen durch Bereitstellung von MessageBrokers zu erleichtern .

Pugmarx
quelle
Ich möchte eine asynchrone Verarbeitung, da die RestService-API synchron ist. Wie es mit ActiveMq und Jms geht. Bitte helfen Sie dabei. stackoverflow.com/questions/19706788/… . Vielen Dank für Ihre Hilfe und Zeit
Kumar
10

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.

RichardOD
quelle
8

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.

Kevin Williams
quelle
1
Bitte helfen Sie dabei. stackoverflow.com/questions/19706788/… . Vielen Dank für Ihre Hilfe und Zeit.
Kumar
2
Aufgrund einer asynchronen Anforderung und eines Netzwerkproblems wird Ihre Nachricht möglicherweise nicht gesendet. Was ist damit? Wenn Sie Sachen kaufen möchten, muss Ihre Nitifizierung gesendet werden. tut es nicht?
grep
8

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:

  1. Aktualisieren Sie die Position der von den Kunden aufgegebenen Bestellungen, wenn die Sendung von einem Ort zum anderen transportiert wird. Dies erfolgte durch kontinuierliches Senden von Nachrichten an die JMS-Warteschlange.
  2. Benachrichtigung über ungewöhnliche Ereignisse wie Verspätung des Versands und anschließendes Senden einer E-Mail an den Kunden.
  3. Wenn die Lieferung ihren Bestimmungsort erreicht hat, wird ein Zustellungsereignis gesendet.

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.

QWERTY
quelle
6

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 .

Paradisonoir
quelle
6

Apache Camel, das in Verbindung mit ActiveMQ verwendet wird, ist eine hervorragende Möglichkeit, Enterprise Integration Patterns zu erstellen

Rob Davies
quelle
5

Wir haben Messaging verwendet, um Online-Angebote zu erstellen

Bluegene
quelle
4

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 ...

Roundrobin
quelle