Erlang / OTP-Architektur: REST-konformes Protokoll für SOAish-Dienste

8

Stellen wir uns vor, wir haben ein Auftragsverarbeitungssystem für einen Pizza-Laden, um zu entwerfen und zu bauen.

Die Anforderungen sind:

R1. Das System sollte Client- und Anwendungsfall-unabhängig sein, was bedeutet, dass auf das System von einem Kunden zugegriffen werden kann, der beim ersten Entwurf nicht berücksichtigt wurde. Wenn der Pizza-Shop beispielsweise entscheidet, dass viele seiner Kunden später die Samsung Bada-Smartphones verwenden, müssen beim Schreiben eines Clients für Bada OS die API des Systems und das System selbst nicht neu geschrieben werden. oder wenn es sich zum Beispiel herausstellt, dass die Verwendung von iPads anstelle von Android-Geräten für Auslieferungstreiber besser ist, dann wäre es einfach, einen iPad-Client zu erstellen und die API des Systems in keiner Weise zu beeinflussen;

R2. Wiederverwendbarkeit, was bedeutet, dass das System einfach neu konfiguriert werden kann, ohne viel Code neu schreiben zu müssen, wenn sich der Geschäftsprozess ändert. Zum Beispiel, wenn später die Pizzeria beginnt, Zahlungen online zu akzeptieren und Bargeld von Lieferfahrern zu akzeptieren (eine Zahlung anzunehmen, bevor eine Bestellung angenommen wird, VS eine Zahlung bei Lieferung zu akzeptieren), dann wäre es leicht, das System an den neuen Geschäftsprozess anzupassen ;

R3. Hohe Verfügbarkeit und Fehlertoleranz, was bedeutet, dass das System online sein sollte und Bestellungen rund um die Uhr annehmen sollte.

Um R3 zu erreichen, könnten wir Erlang / OTP verwenden und die folgende Architektur haben:

Das Problem ist, dass diese Art von Architektur eine Menge "fest codierter" Funktionalität enthält. Wenn zum Beispiel der Pizzaladen von der Annahme von Barzahlungen bei Lieferung zu Annahme von Online-Zahlungen wechselt, bevor die Bestellung aufgegeben wird, wird es viel Zeit und Mühe erfordern, das gesamte System umzuschreiben und die API des Systems zu modifizieren.

>

Wenn die Pizzeria außerdem einige Verbesserungen an ihrem CRM-Client benötigt, müssen wir die API, die Clients und das System selbst neu schreiben.

Die folgende Architektur zielt darauf ab, diese Probleme zu lösen und somit dazu beizutragen, R1, R2 und R3 zu erfüllen:

Jeder "Service" im System ist ein Webserver mit einer RESTful-API. Ein solcher Ansatz hat folgende Vorteile:

  • alle Güte von Erlang / OTP, da jede Webmaschine eine Erlang-Anwendung ist, die überwacht werden kann und in eine Erlang-Version versetzt werden kann;
  • serviceorientierte Architektur mit allen Vorteilen von SOA;
  • leicht anpassbar an Änderungen im Geschäftsprozess;
  • einfach neue Clients und neue Funktionen zu Clients hinzufügen (zB zum CRM Client), da ein Client RESTful APIs aller Dienste im System statt einer 'zentralen' API verwenden kann (Service Composability in Bezug auf SOA) .

Die im zweiten Bild vorgeschlagene Systemarchitektur ist also im Wesentlichen eine serviceorientierte Architektur, bei der jeder Service eine RESTful-API anstelle eines WSDL-Vertrags hat und jeder Dienst eine Erlang / OTP-Anwendung ist.

Und hier sind meine Fragen:

  1. Bild 2: Versuche ich das Rad hier neu zu erfinden? Soll ich mich stattdessen an die reine Erlang / OTP-Architektur halten? ("Pure Erlang" bedeutet Erlang-Anwendungen, die in einem Release verpackt sind und miteinander kommunizieren gen_server: call und gen_server: cast function calls);
  2. Können Sie irgendwelche Nachteile in der vorgeschlagenen Vorgehensweise nennen? (Bild 2)
  3. Glauben Sie, dass es einfacher wäre, ein System wie dieses (Bild 2) zu pflegen und zu erweitern (R1 und R2) als ein wahres Erlang / OTP-System?
  4. Die Sicherheit eines solchen Systems (Bild 2) könnte ein Problem sein, da es viele Zugangspunkte für das Web gibt (RESTful APIs aller Dienste) und nicht nur einen Eingangspunkt (Bild 1), nicht wahr? so?
  5. Ist es in Ordnung, mehrere "orchestrierende Module" in einem solchen System zu haben, oder gibt es vielleicht eine bessere Praxis? ("Bestellungen annehmen", "CRM" und "Versandaufträge" auf Bild 2);
  6. Hat reines Erlang / OTP (Bild 1) Vorteile gegenüber diesem Ansatz (Bild 2) hinsichtlich Message Passing und den Einschränkungen des Protokolls? (teilweise in meiner vorherigen ähnlichen Frage , gen_server: VS HTTP RESTful-Aufrufe aufrufen
skanatek 29.06.2012, 20:32
quelle

2 Antworten

1

Ich würde den dritten Weg einführen, der eher kosteneffektiv und reaktiv ist. Die Architektur sollte auf jeden Fall serviceorientiert sein, da Sie explizit Services haben. Es ist jedoch nicht erforderlich, jeden Dienst als Restful- oder WSDL-definierter Dienst verfügbar zu machen. Ich bin kein Erlang-Entwickler, aber ich glaube, es gibt eine Möglichkeit, lokale und Remote-Prozesse per Messaging aufzurufen und somit unnötige Serialisierungs- / Serialisierungsaktivitäten für interne Anrufe zu vermeiden. Aber eines Tages wirst du mit einem neuen Integrationsproblem konfrontiert sein. Zum Beispiel werden Sie ein Buchhaltungs- oder Logistiksystem integrieren. Wenn Sie die Architektur dann in Bezug auf SOA-Prinzipien gut entworfen haben, werden die meisten Anstrengungen damit verbunden sein, vorhandene Services mit REST-fähigen Front-End-Wrappern zu offenbaren, ohne dass bestehende Verbindungen zu anderen Services umgestaltet werden müssen. Aber das Problem besteht darin, den Zuständigkeitsbereich sauber zu halten. Ich meine, jeder Dienst sollte für die Aktivität verantwortlich sein, die er ursprünglich entworfen hat.

Das von Ihnen erwähnte Sicherheitsproblem ist bekannt. Sie sollten Authentifizierung / Autorisierung in allen exponierten Diensten haben, zum Beispiel mit Token.

    
Viktor Stolbin 01.07.2012, 12:48
quelle
2

Bei SOA ist zu beachten, dass es in der Architektur nicht um die Technologie geht (REST, WS *). So können Sie bei Bedarf eine gute SOA mit Endpunkten verschiedener Typen erhalten (was ich eine Edge-Komponente nenne) - Trennung von Geschäftsprozessen Logik aus anderen Bereichen wie Kommunikation und Protokolle) Außerdem ist es wichtig zu beachten, dass die Service-Grenze eine Vertrauensgrenze ist. Wenn Sie sie überschreiten, müssen Sie sich möglicherweise authentifizieren und autorisieren, das Netzwerk kreuzen usw. Außerdem sollte die Trennung in Schichten (wie Daten und Logik) nicht so funktionieren, wie Sie sie partitionieren Dienstleistungen.

Nach dem, was ich in Ihren Fragen lese, würde ich die Dienste wahrscheinlich in grobkörnigere Dienste aufteilen (siehe unten). Kommunikation innerhalb der Grenzen des Dienstes kann unabhängig von der Art sein, in der die Kommunikation zwischen Diensten eine öffentliche API verwendet (REST oder Erlang-native liegt bei Ihnen, aber der Punkt ist, dass sie verwaltet, versioniert, gesichert usw. ist) Der Dienst kann Endpunkte in mehreren Technologien haben, um verschiedene Benutzer zu unterstützen (manchmal verwenden Sie einen ESB, um zwischen Diensten und Protokollen zu vermitteln, aber die Notwendigkeit dafür hängt von der Größe und Komplexität Ihres Systems ab)

In Bezug auf Ihre spezifischen Fragen

  • 1 Wie oben erwähnt, denke ich, dass es einen Ort gibt, an dem mehr öffentliche APIs verfügbar gemacht werden als nur einen einzigen Einstiegspunkt, bin ich mir nicht sicher, dass jeder und Jede Fähigkeit als Service mit Public-API ist der richtige Weg sehen.
  • 2 & amp; 3 Die Nachteile des Freilegens jeder kleinen Sache ist Verwaltungsaufwand, verringerte Leistung (z. B. müssen Sie authentifizieren sich bei diesen Anrufen). Sie erhalten Nano-Dienste Dienste deren Overhead mehr ist als ihr Nutzen.
  • Eine Sache, die über die Sicherheit hinzugefügt werden sollte, ist, dass die Tatsache, dass ein Dienst eine REST-API hat, nicht übersetzt werden muss, um diese API der Allgemeinheit zugänglich zu machen. Bereitstellungsweise können Sie es hinter einer Firewall halten und den Zugriff auf bekannte Adressen beschränken usw.

    • 5 Es ist in Ordnung, mehrere orchestrierende Module zu haben. Wenn Sie jedoch ein paar mehr erreichen, sollten Sie vielleicht ein Orchestrierungsmodul (und ESB oder eine Orchestrierungs-Engine) in Betracht ziehen, alternativ können Sie eine ereignisbasierte Integration verwenden das ist flexibler (aber etwas weniger überschaubar)

    • 6 Die erste Option hat den Vorteil einer einfachen Entwicklung und wahrscheinlich einer besseren Leistung (wenn das ein Problem ist). Die hartcodierte Integrationsschicht kann sich im Laufe der Zeit als schwieriger erweisen. Die erlang-Dienste sollten, wenn Sie sie geschrieben haben, in der Lage sein, sich unabhängig voneinander weiterzuentwickeln, wenn Sie die API-Integration und Nachrichtenübermittlung zwischen ihnen beibehalten (glücklicherweise macht Erland dies relativ leicht durch seine inhärenten Merkmale (z. B. Unveränderbarkeit)).

    
Arnon Rotem-Gal-Oz 04.07.2012 20:43
quelle

Tags und Links