Einfachste Form der Prozesskommunikation in Scala

8

Was ich tun möchte : Ich möchte einige Funktionen in Scala hinzufügen, die bald zu JAR-Bibliotheken für Java gehören sollen, und ich möchte dies auf die schmerzloseste Weise tun , ohne Tomcat, wars, Pfade für GET - Anfragen, RPC - Server usw.

Was ich getan habe Ich habe eine Reihe von Bibliotheken überprüft, wie Jetty, JAX-RS, Jackson usw. Aber dann sehe ich die Beispiele und sie beinhalten normalerweise viele verschiedene Ordner für Konfiguration, WSDL-Dateien usw. Die meisten Beispiele haben keine Hauptmethode und ich habe kein klares Bild davon, wie viele zusätzliche Anforderungen sie haben könnten (zB Tomcat).

Was ich vorhabe zu tun : Ich überlege, einfach einen Socket auf dem "Server" zu öffnen, um ihn anzuhören, verbinde mich dann mit dem "Client" und übertrage JSON in beide Richtungen. Dies sollte ziemlich Standard sein, damit ich andere Programmiersprachen auf kompatible Weise (z. B. Python) verwenden kann.

Was ich möchte Ich würde gerne wissen, ob es eine Bibliothek gibt, die das vereinfacht. Nicht unbedingt rohe Sockets, aber einige Prozess-Kommunikation in ein paar Zeilen, vielleicht nicht so einfach wie Node.js, aber etwas ähnliches.

Bonus : Es wäre cool zu

  • kann andere Programmiersprachen (z. B. Python) verwenden, indem Sie offene Standards verwenden
  • hat eine Authentifizierung

Aber ich brauche wirklich keine von denen an diesem Punkt.

    
jmora 31.10.2014, 18:28
quelle

4 Antworten

6

Ich denke, dass Sie RPC-Client / Server-System benötigen, würde ich vorschlagen, eine dieser beiden zu nehmen:

  1. Finagle - super flexibler und leistungsfähiger RPC-Client / Server von Finagle. Sie können Ihren Dienst mit Thrift definieren und Stubs für Client / Server in Scala generieren. Mit Thrift sollte es einfach sein, Python-Unterstützung hinzuzufügen.

  2. Spray - viel kleinere Bibliothek, die sich auf die Erstellung von REST-Diensten konzentriert. Es ist nicht so mächtig wie Finagle, aber viel einfacher. Und mit REST können Sie beliebige andere Clients verwenden

  3. Remote - ein elegantes RPC-System für vernünftige Leute. Interessantes und vielversprechendes Projekt, aber vielleicht wegen der umfangreichen Scalaz + Shapeless + Makro-Nutzung schwierig zu starten

Eugene Zhulenev 31.10.2014, 18:58
quelle
1

Ehrlich gesagt, wenn Sie etwas wollen, das sprachübergreifend, einfach, geradlinig und prägnant ist, dann wollen Sie keine einfachen alten Sockets verwenden!

Schau dir den Dropwizard an. Es ist erstaunlich und ich benutze es für kleine und große Projekte gleichermaßen! Es wird normalerweise von nicht mehr als einer einzigen Konfigurationsdatei konfiguriert. Es unterstützt die Authentifizierung auch!

Out-of-the-Box gibt es wirklich tolle Inter-Prozess-Kommunikation über JSON (mit Jackson) und vieles mehr. Es gibt auch eine ziemlich gute Scala-Unterstützung für den Dropwizard .

Wenn Sie Ihre eigene Rolle rollen müssen, würde ich Jackson für JSON-Parsing empfehlen. Es ist super einfach zu bedienen und hat auch einen großartigen scala-Support .

    
Nate 31.10.2014 18:48
quelle
0

Wenn Sie einen "kontrollierten" Anwendungsfall haben, bei dem sich Client und Server im selben LAN befinden und parallel bereitgestellt werden, würde ich (kontrovers) Java RMI ; Es ist dumm und JVM-spezifisch (und verwendet ein Java-spezifisches Protokoll), aber es ist sehr einfach zu verwenden.

Wenn Sie etwas robusteres und mehrsprachiges benötigen, empfehle ich Apache Thrift . Sie schreiben Ihre Schnittstellen in eine plattformunabhängige Schnittstellendefinitionssprache und es ist sehr klar, welche Änderungen kompatibel sind und welche nicht; Der Sparsamkeits-Compiler erzeugt skeleton Schnittstellen, die Sie verwenden können, und dann schreiben Sie einfach eine Implementierung dieser Schnittstelle und ein paar Zeilen, um den Server zu starten (wie Sie aus dem Beispiel auf der Homepage sehen können). Es hat auch gute Unterstützung für asynchrone Implementierungen, wenn Sie die Leistung benötigen. Thrift selbst ist einigermaßen standard und plattformübergreifend, mit einem eigenen Binärprotokoll, oder Sie können JSON als Transport verwenden, wenn Sie das wirklich wollen (ich würde das aber trotzdem empfehlen).

    
lmm 31.10.2014 20:17
quelle
0

RabbitMQ bietet einen einfachen Weg, um zu tun, was Sie wollen, ohne einen Server zu schreiben und Ihren zu implementieren eigene Persistenz, Flusskontrolle, Authentifizierung, etc. Sie können brew oder apt-get installieren.

  • Sie starten einen Broker-Daemon-Prozess (d. h. verwaltet Nachrichtenwarteschlangen)
  • Im Scala-Producer können Sie die von Maven bereitgestellte Java-API verwenden, um JSON-Zeichenfolgen (z. B. keine Definitionssprachen) an bestimmte Warteschlangen
  • zu senden
  • Stellen Sie dann in Ihrem anderen Scala-Programm eine Verbindung zum Broker her und warten Sie auf Nachrichten in der Warteschlange und parsen Sie den eingehenden JSON

Da es so beliebt ist, gibt es viele Online-Lernprogramme für verschiedene Muster, die Sie zum Verteilen der Nachrichten verwenden möchten, z. pub / sub, one-to-one, genau-einmal-Lieferung, etc.

    
EthanP 25.05.2016 21:45
quelle

Tags und Links