web-dev-qa-db-ger.com

Grpc und Null-Q-Vergleich

Ich würde gerne die Fähigkeiten von grpc mit denen von zeromq und seinen Mustern vergleichen. Und ich würde gerne einen Vergleich erstellen (Funktionsumfang) - irgendwie - 0mq sind "bessere" Sockets - aber auf jeden Fall - wenn ich 0mq-Muster anwende - I bekomme vergleichbare 'frameworks' denke ich - und hier scheint 0mq viel flexibler zu sein ...

Die Hauptanforderungen sind:

  • async req/res Kommunikation (Inproc oder Remote) zwischen Knoten
  • flexibles Nachrichtenrouting
  • loadbalancing-Unterstützung
  • gut dokumentiert

irgendwelche Ideen?

vielen Dank!

36
user3169252
  • async req/res Kommunikation (Inproc oder Remote) zwischen Knoten

Beide Bibliotheken ermöglichen eine synchrone oder asynchrone Kommunikation, je nachdem, wie die Kommunikation implementiert werden soll. Siehe diese Seite für gRPC: http://www.grpc.io/docs/guides/concepts.html . Grundsätzlich ermöglicht gRPC eine typische HTTP-synchrone Anforderung/Antwort oder ein bidirektionales "websocket-ähnliches" Streaming. Für 0mq können Sie eine einfache REQ-REP-Verbindung einrichten, die im Grunde genommen ein synchroner Kommunikationspfad ist, oder Sie können asynchrone ROUTER-DEALER-Typologien erstellen.

  • flexibles Nachrichtenrouting

"Routing" bedeutet im Wesentlichen, dass eine Nachricht über einen Broker von A nach B gelangt. Dies geschieht in 0mq trivial und es gibt eine Reihe von Typologien, die solche Dinge unterstützen ( http://zguide.zeromq.org/page:all#Basic-Reliable-Queuing-Simple-Pirate-Pattern =). In gRPC könnte dieselbe Art von Typologie mit einer "Pub-Sub" -ähnlichen Verbindung über einen Stream erstellt werden. gRPC unterstützt das Einfügen von Metadaten in die Nachricht ( https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md ), sodass Sie a Nachricht in eine Warteschlange, aus der eine "Pub-Sub" -Verbindung gezogen werden kann.

  • loadbalancing-Unterstützung

gRPC unterstützt Integritätsprüfungen ( https://github.com/grpc/grpc/blob/master/doc/health-checking.md ), da es sich jedoch um HTTP/2 handelt, muss dies geschehen einen HTTP/2-Lastenausgleich zur Unterstützung der Integritätsprüfung. Dies ist jedoch keine große Sache, da Sie die Integritätsprüfung an einen HTTP/1.1-Dienst binden können, den der Load Balancer aufruft. 0mq ist eine TCP-Verbindung, was bedeutet, dass ein Load Balancer wahrscheinlich eine "Socket-Verbindung" in tcpmode überprüft, um die Verbindung zu überprüfen. Das funktioniert aber es ist nicht so schön. Auch hier kann der 0mq-Dienst mit einem HTTP/1.1-Webserver, von dem der Load Balancer liest, problemlos ausgeführt werden.

  • gut dokumentiert

beide sind gut dokumentiert. Die Dokumentation von 0mq muss gelesen werden, um die Technologie vollständig zu verstehen.

Hier sind die großen Unterschiede:

  1. 0mq ist ein TCP-Protokoll, während gRPC HTTP mit einer binären Nutzlast ist.
  2. 0mq erfordert, dass Sie ein Framing-Protokoll entwerfen (Frame 1 = Verison, Frame 2 = Payload usw.), wohingegen ein Großteil dieser Arbeit in gRPC für Sie erledigt wird
  3. gRPC wird transparent in REST ( https://github.com/grpc-ecosystem/grpc-gateway ) konvertiert, während 0mq eine Middleware-Anwendung erfordert, wenn Sie sprechen möchten REST dazu.
  4. gRPC verwendet Standard-TLS x509-Zertifikate (think websites), während 0mq ein benutzerdefiniertes Verschlüsselungs-/Authentifizierungsprotokoll verwendet ( http://curvezmq.org/ ). Vor 4.x gab es keine Verschlüsselungsunterstützung in 0mq und wenn Sie es wirklich wollten, mussten Sie in diesen Mist eintauchen: https://wiki.openssl.org/index.php/BIO . (Vertrau mir, tu es nicht)
  5. 0mq kann einige ziemlich kranke Typologien erzeugen ( https://github.com/zeromq/Majordomo ) ( https://rfc.zeromq.org/spec:7/MDP/ =) während gRPC grundsätzlich Client/Server ist
  6. 0mq benötigt viel mehr Zeit zum Erstellen und Ausführen, während gRPC im Grunde genommen Protobuf-Meldungen kompiliert und den Service in Ihren Code importiert.
44
ascotan

Nicht ganz das Gleiche. gRPC dient in erster Linie der heterogenen Interoperabilität von Diensten. ZeroMQ (ZMQ/0MQ/ØMQ) ist ein Messaging-Framework auf niedrigerer Ebene. ØMQ gibt die Payload-Serialisierung nicht über die Übergabe von Binärblobs hinaus an, während gRPC standardmäßig Protokollpuffer auswählt. ØMQ ist so ziemlich auf dem gleichen Computer oder den gleichen Computern zwischen Rechenzentren/Clouds fixiert, während gRPC möglicherweise auch auf einem echten Client funktioniert (dh mobil oder im Web, es unterstützt bereits iOS). gRPC mit ØMQ könnte für In-Cloud-/Datacenter-Services erheblich schneller und effizienter sein als der Overhead, die Latenz und die Komplexität der HTTP2-Anforderungs-/Antwortkette. Ich bin mir nicht sicher, wie (oder sogar ob) gRPC TLS-Sicherheit für die Nutzung in öffentlichen Clouds und auf Mobilgeräten/im Internet geeignet ist Router-/Controller-Ebene des App-/App-Frameworks und Ausführung im Nur-Text-Modus (wodurch auch OpenSSL Fork BoringSSL von Wartungsproblemen aufgrund von Upstream-Fehlern befreit wird).

Bei Diensten mit sehr hoher Latenz/geringer Bandbreite (z. B. Mission to Mars) würde man sich überlegen, ob RPC einen Transport wie SMTP (z. B. Active Directory Alternate Replication) oder MQTT (z. B. Facebook Messenger, ZigBee, SCADA) verwendet.

Bonus (Off-Topic): Es wäre schön, wenn gRPC alternative steckbare Transporte wie ØMQ (das auch selbst UNIX-Sockets, TCP, PGM und Inproc unterstützt) hätte, da HTTP/2 noch nicht in allen Sprachen stabil ist und langsamer als ØMQ. Ein Blick auf nanomsg (insbesondere in der HFT-Welt) lohnt sich, da es mit RDMA/SDP/MPI erweitert und für verrückte Anwendungen mit geringer Latenz/ohne Kopien/Infiniband-fähig gemacht werden kann.

27
user246672