Phil Wilkins | Cloud Developer Evangelist, Oracle | Dezember 2022
Eine Software muss mit einer anderen Software sprechen. Manchmal muss Software in einem Teil einer Anwendung Services anfordern oder Daten mit einem anderen Teil der Anwendung austauschen. Oder eine Anwendung muss Dienste anfordern oder Daten mit einer ganz anderen Anwendung austauschen.
Es gibt zwei typische Mechanismen, die für diese Art der Kommunikation verwendet werden: Anwendungsprogrammierschnittstellen (APIs) und Messaging.
Die Unterschiede zwischen APIs und Messaging können manchmal verwirrend sein. Das liegt daran, dass die Begriffe sehr vieldeutig verwendet werden. Das Akronym API selbst hat zwar eine explizite Bedeutung, doch aus Gründen, die wir weiter unten erläutern werden, hat der Begriff mehrere verschiedene Bedeutungen angenommen. Messaging ist ein Begriff, der oft sehr lose verwendet wird, um fast jede System-zu-System-Kommunikation abzudecken. Lassen Sie uns also klären, was mit APIs und Messaging wirklich gemeint ist.
Grob gesagt ist eine API der Vertrag, der festlegt, wie eine Software Dienstanforderungen empfangen und beantworten kann. Der Vertrag wird von den Entwicklern der Software erstellt.
Klingt einfach? Ist es auch, zumindest auf einer Ebene. In der Praxis kann sich die implizite Bedeutung von API je nach dem, worum es gerade geht, ändern. Wenn wir das Akronym entpacken, geht es bei einer API um die Schnittstelle oder den „Vertrag“, über den eine Software mit einer anderen Software interagieren kann. Manchmal konzentriert sich die Diskussion über eine API auf die übergeordneten architektonischen Definitionen; manchmal ist sie sehr detailliert und beschreibt die spezifischen Möglichkeiten, wie Entwickler die API implementieren.
In einigen Büchern und Artikeln über APIs wird der Vergleich verwendet, dass eine API eine Tür ist, wobei die Eigenschaften der API die Tür beschreiben. Dabei kann es sich beispielsweise um eine automatisch geöffnete Lebensmittelgeschäftstür oder um eine extrem sichere Banktresortür handeln. Der Vertrag einer Anwendung – die Eigenschaft der Tür – sollte dazu beitragen, Überlegungen wie diese zu berücksichtigen:
Während APIs die Bedingungen für das Senden und Empfangen von Serviceanfragen durch Software definieren, ist Messaging der Prozess zum Senden von Informationen von einem System an ein anderes. Das Schlüsselwort hierbei lautet „Prozess“.
Stellen Sie sich das folgendermaßen vor:
Messaging bezieht sich auf den Prozess der Übertragung eines Informationspakets – der Nachricht – vom Serviceanforderer an den Serviceanbieter (oft unter Verwendung einer dritten Partei, die als Broker bekannt ist).
Um einen Vergleich aus der Praxis zu verwenden: Stellen Sie sich ein Unternehmen vor, das eine Textnachricht an einen Kunden sendet. Der Serviceanbieter muss die Telefonnummer des Empfängers kennen, damit der Mobilfunkanbieter die Nachricht übermitteln kann. Die Nutzlast selbst kann jedoch aus der Sicht des Mobilfunkanbieters eine beliebige sein. Der Anbieter muss nicht wissen, ob Ihre Textnachricht auf Englisch, Spanisch oder Japanisch verfasst wurde oder einfach nur ein Emoji umfasst.
Der Begriff Messaging bezieht sich auf alle Vorgänge, die hinter den Kulissen ablaufen, um die Nachricht vom Absender zum Kunden zu bringen.
Sie und Ihr Kunde müssen nicht verstehen, wie der Nachrichtenübermittlungsprozess funktioniert. Sie vertrauen darauf, dass die Netzbetreiber und Smartphone-Hersteller ihre Arbeit richtig gemacht haben. Und ebenso muss der Netzbetreiber die Nutzlast nicht verstehen. Er muss lediglich sicherstellen, dass sie an die richtige Person übermittelt wird und nicht verfälscht oder verzerrt ist.
Es sei noch einmal darauf hingewiesen, dass die meisten Messaging-Plattformen sich nicht um die Nutzlast kümmern, solange diese innerhalb der Grenzen der Technologie liegt. Um zu unserem Vergleich zurückzukehren: Es ist den Smartphone- und Mobilfunkanbietern egal, ob Ihr Text auf Englisch verfasst wurde oder einfach nur ein Emoji umfasst.
Weitere Informationen zur Zusammensetzung von APIs, API-Plattformen und API-Verwaltung.
Unternehmenssoftware-Systeme werden aus mehreren separaten, ausführbaren Prozessen erstellt und erfordern somit Interprozesskommunikation (Interprocess Communication, IPC). Die Kommunikation kann hier komplex sein und viele wechselseitige API-Aufrufe mit einer Menge streng formatierter Daten erfordern, um eine Transaktion durchzuführen. Diese Transaktionen müssen sorgfältig orchestriert und in der richtigen Reihenfolge abgeschlossen werden, um Geschäftsanforderungen zu erfüllen.
Beispiel: Eine Kundenbestellung. Der Prozess muss auf die Kundendatenbank zugreifen, die Bestandsdatenbank, das Buchhaltungssystem, ein Rechnungserstellungssystem und das Kreditkartenabrechnungssystem abfragen, den Bestand und das Kundenkonto anpassen, eine Lageranforderung erstellen und eine Versandanforderung auslösen – all das muss in der richtigen Reihenfolge und korrekt ausgeführt werden.
Früher wurden diese Interaktionen mit einer Form von Shared Storage ausgeführt, wie einem Dateisystem oder einer Datenbank. In modernen Unternehmenssystemen können die Prozesse jedoch direkt miteinander kommunizieren, wodurch der Prozess beschleunigt und Probleme beseitigt werden (z. B. wenn der Bestand für Ihren Auftrag bereits durch frühere Aufträge belegt ist).
Wir können unsere Kommunikation als synchron oder asynchron charakterisieren. Synchrone Kommunikation bedeutet, dass alle an einer Kommunikation beteiligten Parteien anwesend und in der Lage sein müssen, immer wieder zu Wort zu kommen. In unserem Bestellbeispiel müssen die am elektronischen Zahlungsverkehr beteiligten Systeme für eine Interaktion in Echtzeit verfügbar sein. In anderen Fällen kann die Kommunikation asynchron sein, sodass die Parteien der Systeme, die miteinander kommunizieren wollen, nicht zum gleichen Zeitpunkt anwesend sein müssen. So funktioniert der E-Mail-Verkehr. Damit Asynchrone Kommunikation funktioniert, benötigen wir einen Vermittler, um die wechselseitige Weitergabe von Informationen zu ermöglichen.
Diese komplexen Unternehmens-Messaging-Systeme gibt es in verschiedenen Varianten oder Mustern:
Service Bus. Der Service Bus fungiert als Klebstoff zwischen verschiedenen Prozessen und führt eine Orchestrierung zwischen diesen Prozessen aus, z.B. in der oben genannten komplexen Transaktion. Service-Bus-Systeme verfügen in der Regel über Mehrwertfunktionen, wie z. B. die Möglichkeit, Nutzdaten von einem Format in ein anderes zu übersetzen (Englisch in Französisch in unserem Textnachrichten-Vergleich), Nachrichten auf der Grundlage des Nachrichteninhalts weiterzuleiten oder sogar einige Entscheidungen auf der Grundlage des Status der komplexen Transaktion zu treffen. Zum Beispiel: Die Aufgaben A und B können parallel ausgeführt werden. Führen Sie Aufgabe C aus, sobald Aufgabe B erfolgreich abgeschlossen wurde. Wenn Aufgabe B fehlschlägt, führen Sie Aufgabe D aus. Wenn Aufgabe D fehlschlägt, soll ein Mensch eingreifen.
Service-Bus-Messaging wird manchmal als Smart Pipe bezeichnet, da die zusätzliche Intelligenz in Bezug auf die Weiterleitung und Planung der Nachrichtenübermittlung in der Pipeline zwischen den Anbietern und Verbrauchern zum Tragen kommt. Das wird außerdem als Orchestrierung bezeichnet.
Ein synonymer Begriff für Service Bus ist der Nachrichtenbus. Als sich diese Technologien erstmals zu serviceorientierten Architekturlösungen (SOA) entwickelten, gab es einige Unterschiede zwischen Nachrichtenbussen und Servicebussen. Heute gibt es keine echten Unterschiede mehr. Es wird zunehmend sogar die kürzere Bezeichnung „Bus“ verwendet.
Webservices: Im weitesten Sinne des Begriffs stellen Webservices eine direkte synchrone Kommunikation zwischen zwei Prozessen dar, die üblicherweise die TCP- und HTTP-Protokolle (oder Variationen wie HTTPS und HTTP/2) verwendet. Verbraucher und Client werden als Point-to-Point-Verbindungen realisiert (obwohl es üblich ist, dass die Anbieterseite mehrere gleichzeitige Kundenverbindungen unterstützt). Zwischen den beiden Prozessen können Proxys (von Netzwerk-Firewalls bis hin zu API-Gateways und Web-Caches) und Netzwerk-Zwischenstationen (Switches und Router) stehen, die aber weder dem Anbieter noch dem Verbraucher bewusst sind.
Message Broker:Message Broker sind Vermittler zwischen dem Nachrichtenanbieter und dem Nachrichtenverbraucher und haben Gemeinsamkeiten sowohl bei Service Buses als auch bei Webservices.
Broker befinden sich zwischen dem Absender und den Nachrichtenempfängern. Sie erhalten die Nachricht, die übermittelt wird, und speichern sie, bis die Empfänger sie abrufen. Das bedeutet, dass die Nachricht übermittelt werden kann, ohne dass man sich Gedanken über die unmittelbare Verfügbarkeit des Empfängers machen muss. Infolgedessen wird diese Art von Kommunikation oft als asynchron oder „fire and forget“ bezeichnet, weil Sie sicher sein können, dass die Nachricht irgendwann zugestellt wird, solange der Broker funktionsfähig bleibt.
Die Ähnlichkeit mit Webservices ergibt sich aus der Tatsache, dass die Verbindung zwischen Client und Broker als Point-to-Point-Verbindung dargestellt wird; der Message Broker ist funktionell unsichtbar.
Die Ähnlichkeit mit einem Service Bus ergibt sich aus der Tatsache, dass der Broker einen Mehrwert-Service anbietet, indem er die empfangenen Nachrichten speichern kann, bis die Empfänger verfügbar sind. Im Gegensatz zu einem robusteren Service Bus verfügt ein Message Broker nur über minimale Intelligenz, um einfache Dinge zu verstehen, wie z. B. zu wissen, welche Empfänger eine bestimmte Nachricht erhalten möchten und was zu tun ist, wenn der Empfänger die Nachricht nicht rechtzeitig abruft.
Ein vermittelter Kommunikationsstil wird auch Dumb Pipe genannt. Da die Broker nur über minimale Intelligenz verfügen, müssen die Endpunkte verstehen, was erforderlich ist, wenn eine Nachricht gesendet oder empfangen werden muss. Dieser Stil wird als Choreografie (im Gegensatz zur intelligenteren Orchestrierung eines Service Bus) bezeichnet.
Für diese Diskussion kann Streaming als eine eher besondere Form der Nachrichtenübermittlung angesehen werden, obwohl einige Streaming-Technologien ein Element der Datenverarbeitung unterstützen können. Streaming beschreibt in diesem Zusammenhang das Senden eines kontinuierlichen Stroms von Ereignissen durch die IPC-Technologie an dieselben Ziele, unabhängig davon, ob Webdienste oder Message Broker die Kommunikation durchführen. (Sehr selten sind Service Buses beteiligt, da die Datenmenge zu groß ist und zu schnell fließt, als dass die zusätzliche Intelligenz eines Service Bus benötigt wird.)
Neben dem kontinuierlichen Datenfluss in einem Stream wird beim Streaming in der Regel eine nahezu echtzeitfähige oder latenzarme Verbindung erwartet. Das ist keine Überraschung, wenn man bedenkt, dass Dienste wie Netflix traditionell als Video-Streaming bezeichnet werden. Man will ja nicht, dass Video-Inhalte gestoppt und erneut gestartet werden, während neue Video-Bits vom Anbieter übermittelt werden oder während ein Message Broker das Video von einem Format in ein anderes umwandelt.
Häufige Technologien für Webservice-Streaming sind WebSockets, gRPC-Streams und GraphQL-Abonnements. Wenn es um vermittelte Messaging-Streams geht (mit Technologien wie Kafka), können Sie manchmal die Arbeitsweise des Brokers nutzen, um einen „Ausschnitt“ der übertragenen Ereignisse zu betrachten. Auf diese Weise erhalten Sie wertvolle Erkenntnisse, einschließlich Informationen über den Stream selbst – deshalb der Begriff Streaming Analytics.
Während die in Streaminganalysen angewendete Logik komplex sein kann, führt der Message Broker keine Entscheidungs- oder Nachrichtenmanipulation durch. Deshalb wird der Broker immer noch als dumm bezeichnet. Diese Arten von Streaminganalysefunktionen werden häufig mit Technologien wie Kafka Streams implementiert.
APIs und Messaging-Systeme sind einfach zu beschreiben, aber sehr komplex in ihren Details und technischen Eigenschaften. Es gibt einfach keinen Raum für Mehrdeutigkeit, was zu einem echten Bedarf an genauen Branchenstandards und Dokumentationen sowie idealerweise der besten Anwendung dieser Standards führt.
Die Entwicklung in diesem Bereich, insbesondere bei APIs, läuft seit mehr als zehn Jahren. Die Branche hat die OpenAPI-Spezifikation für REST-basierte APIs übernommen, die eine Form von Webservices und wahrscheinlich die am häufigsten verwendeten Arten von APIs in moderner Unternehmenssoftware sind.
Bei APIs (und Streaming) gibt es eine Reihe zusätzlicher Standards zum Definieren und Beschreiben von Aspekten der Nachrichten und ihrer Übertragung. Dazu gehören Protokollpuffer (auch Protobuf genannt und mit gRPC verwendet) und in jüngerer Zeit GraphQL, JSON Schema und YAML.
Im Bereich der asynchronen Nachrichtenübermittlung wurde in den letzten Jahren erfolgreich an einer Definition namens AsyncAPI gearbeitet, die Ideen von OpenAPI und anderen fortschreitenden Standards übernommen hat, um die zahlreichen Anforderungen an die Nachrichtenübermittlung zu erfüllen.
Moderne verteilte Anwendungen sind als eine Sammlung von Diensten implementiert, bei denen es sich um separate Software handelt, die manchmal auf denselben Servern läuft, andere Male aber auch nicht. APIs bieten diesen Softwarekomponenten die Möglichkeit, miteinander zu kommunizieren, um Dienste anzufordern oder Informationen auszutauschen. Messaging-Systeme bieten die Infrastruktur, um die asynchrone Kommunikation zu erleichtern und intelligente Vermittler für API-Aufrufe bereitzustellen, die sehr einfach (z. B. Smartphone-Textnachrichten) oder extrem komplex (z. B. Orchestrierung für komplexe mehrstufige Geschäftstransaktionen) sein können. Ganz zu schweigen von den verteilten Services, die über APIs direkt miteinander kommunizieren. Glücklicherweise ermöglichen die sich ständig weiterentwickelnden Techniken und Normen die Verwendung von APIs in allen Bereichen, von Datenbankaufrufen bis hin zum Medien-Streaming. Da diese APIs und Messaging-Standards immer besser werden, wird auch der Übergang zu modernen, verteilten Softwarearchitekturen immer schneller, einfacher und sicherer.