2013-04-30 12 views
13

Ich fange an, service-orientierte Architekturen zu untersuchen und frage mich, wie man das Messaging zwischen Prozessen am besten strukturiert. Es scheint, dass direkte HTTP-Aufrufe zwischen Diensten und/oder einem Pubsub-Bus zwei übliche Ansätze sind. In welchen Situationen ist die eine günstiger als die andere? Ich kann sehen, wie Pubsub zu mehr entkoppelten Diensten führen würde, aber ich habe auch den Eindruck, dass es viel schwieriger wird, den Pfad einer Nachricht durch das System zu verfolgen.Messaging in einer Mikro-Service-Architektur

Welche Ressourcen gibt es, um mehr darüber zu erfahren? Ich bin besonders neugierig darauf im Zusammenhang mit sehr kleinen, "handgerollten" Diensten (z. B. Ruby/Sinatra, Node/Express, Redis Pubsub usw.) im Gegensatz zu irgendwelchen der vorgeschriebenen SOA Stacks/Suites. .. obwohl ich sicher bin, dass die gleichen Prinzipien gelten.

Danke!

Antwort

15

Ich gebe dir meine zwei Cent.

but I also get the impression that it becomes much harder to track a message's path though the system.

Sie haben Recht, dass PubSub SOA-Architekturen AKA (SOA 2.0) ein hohes Maß an Entkopplung bietet, sondern Sie auch einen Preis zahlen, weil dies genau das ist, was passiert, wenn auch Tools wie splunk ein helfen Menge.

seems that direct HTTP calls between services and/or a pubsub bus are two common approaches

Eigentlich, wenn Sie die am häufigsten verwendeten soa Frameworks .net Veranstaltung zu buchen (NServiceBus, Mule und Masstransit) sie nicht verwenden http Anrufe, aber ja können Sie eine Microservices Architektur implementieren und verwenden http wie die Kommunikationsprotokoll.

Ich verstehe Sie wollen einige der besten Enterprise-Architektur-Konzepte anwenden, aber ich würde sagen, dass Sie besser mit einfacheren, aber stärkeren Grundlagen beginnen. Es macht keinen Sinn, zu Event Soa zu springen, ohne zu wissen, ob Sie es wirklich brauchen. Wenn ich ein neues System starten und sicherstellen wollte, dass ich die DDD- und SOA-Prinzipien richtig anpasse, würde ich zunächst die Dienste für meine Domain identifizieren. Also sagen Sie, Sie haben 3 Dienste, Sie könnten damit beginnen, die öffentlichen Verträge für jeden dieser Dienste zu deklarieren, Sie brauchen nichts besonderes, Sie können mit der WCF/ASP.NET Web API mit einer Sync REST API beginnen. Sie würden dann sicherstellen, dass jeder Dienst seine eigene Datenbank erhält, weil Sie eine niedrige Kopplung anstreben, und Sie könnten dann mit der WCF/ASP.NET-Web-API erneut eine API-Ebene erstellen (die für die Außenwelt sichtbar ist). weil Ihre Microservices nicht direkt der Außenwelt ausgesetzt sein sollten. An diesem Punkt hätten Sie eine SOA-ähnliche, aber einfache Architektur, aber da Sie gut definierte Verträge hätten, könnten Sie Ihre Dienste erweitern, indem Sie ihnen asynchrone Funktionen hinzufügen, und dazu würden Sie zunächst eine Nachrichtenwarteschlange hinzufügen zu jedem der Dienste. Wissen Sie, Sie müssen nicht mit einem komplexen System beginnen, sondern mit etwas grundlegendem, klar definiertem beginnen, das Sie skalieren können, wenn Sie müssen.

Das System, das ich beschrieben habe, könnte erweitert werden, um Ereignisse einfach zu unterstützen, wenn Sie das wollten, und die Tatsache, dass Sie zu diesem Zeitpunkt bereits Synchronisierungsnachrichten hätten, würde Sie nicht davon abhalten, auch asynchrone Nachrichten zum System hinzuzufügen.

Aber das sind nur meine zwei Cent.