Asynchronous Messaging
Ziel
- Lose Kopplung zum Austausch von Nachrichten auf unterschiedlichen Plattformen in unterschiedlichen Formaten
- Skalierbarkeit, Fehlertoleranz, Erweiterbarkeit
- Viele Design-Entscheidungen, z.B. QoS Eigenschaften
Einführung Messaging
- Eine Message besteht aus Message Descriptor und Message Data
- Der Queue Manager ist verantwortlich für das Versenden und Empfangen von Nachrichten
- Bei Asynchronous RPC antwortet der Server zwei Mal
- Das erste Mal als Bestätigung der Ausführung (Accept Request)
- Das zweite Mal mit dem Resultat
Messaging Middleware
- z.B. IBM MQ, Microsoft MQ, ActiveMQ (Apache)
Java Message Service (JMS) API
- Grundlegende MOM API
Put
: Append a message to the queueGet
: Block until queue ist not empty, then remove first messagePoll
: Remove first entry if queue is not empty, never blockNotify
: Install a handler to be notified when a message is put into the queue
- Message Reliability Levels
- Eine JMS Message besteht aus Header, Properties und Body
- Properties sind Erweiterungen des Standard-headers und optional
Beispiel Queue Sender (Message Producer)
Connection connection = connectionFactory.createConnection(); connection.start(); Session session = connection.createSession(mp.transacted, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("testQueue"); MessageProducer producer = session.createProducer(destination); producer.setDeliveryMode(DeliveryMode.PERSISTENT); TextMessage message = session.createTextMessage("hello"); producer.send(message); producer.close(); session.close(); connection.close();
Beispiel Queue Receiver (Message Consumer)
Connection connection = connectionFactory.createConnection(); connection.start(); Session session = connection.createSession(mc.transacted, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("testQueue"); MessageConsumer consumer = session.createConsumer(destination); TextMessage text=(TextMessage) consumer.receive(); consumer.close(); session.close(); connection.close();
Enterprise Integration Patterns
Point-to-Point Messaging Pattern
- Simpelste Form, ein Sender schickt einem Receiver über einen beliebigen Channel eine Message
- Meist wird eine Message Expiration gesetzt. Ist diese abgelaufen, wenn der Receiver die Message erhält, wird sie verworfen oder an einen "Dead Letter Channel" geschickt
- Command Message Pattern: Message, die dem Receiver mitteilt, etwas auszuführen
- Document Message Pattern: Reine Daten-Übertragung
Public-Subscribe Pattern
- Der Publisher (Sender) schickt die Messages an einen Publish-Subscribe-Channel
- Der Channel schickt eine Kopie der Message an einen Output Channel
- Jeder Output-Channel hat genau 1 Subscriber
-
Jeder Subscriber erhält die Nachricht 1 Mal
-
Topic-based: Subscriber melden sich an verschiedenen "topics" an (logische Channels) und erhalten nur die Nachrichten, die zu diesen Topics geschickt werden
-
Content-based: Der Subscriber definiert Eigenschaften der Messages, die er bekommen möchte. Er erhält dann nur die Nachrichten, die dem entspechen
-
Meistens gibt es zwischen Publisher und Subscriber einen Message Broker, der die Messages entgegennimmt und Subscribers verwaltet
Receiving Message Endpoint Pattern
- Competing Customers: Mehrere Receiver verarbeiten messages gleichzeitig
- Selective Customer: Der Receiver entscheided beim Ankommen der Message anhand von Kriterien, ob die Message verarbeitet werden soll
RabbitMQ
- Routing: Messages werden Anhand von Eigenschaften an den entsprechenden Receiver zugestellt
- RPC: Beim Request gibt der Client eine Callback Queue an (
reply_to
) und eine eindeutige ID. So wird beim Callback die Response dem Request zugeordnet