web-dev-qa-db-fra.com

comparaison grpc et zeromq

Je voudrais comparer en quelque sorte les capacités de grpc à zeromq et ses modèles: et je voudrais créer une comparaison (ensemble de fonctionnalités) - en quelque sorte - 0mq est de "meilleures" sockets - mais de toute façon - si j'applique des modèles de 0mq - je obtenir des "cadres" comparables, je pense - et ici, 0mq semble être beaucoup plus flexible ...

Les principales exigences sont:

  • communication async req/res (inproc ou remote) entre les nœuds
  • routage flexible des messages
  • support d'équilibrage de charge
  • bien documenté

des idées?

merci!

36
user3169252
  • communication async req/res (inproc ou remote) entre les nœuds

Les deux bibliothèques permettent une communication synchrone ou asynchrone selon la façon de mettre en œuvre la communication. Voir cette page pour gRPC: http://www.grpc.io/docs/guides/concepts.html . Fondamentalement, gRPC permet une demande/réponse synchrone HTTP typique ou un streaming bidirectionnel de type `` websocket ''. Pour 0mq, vous pouvez configurer une connexion REQ-REP simple qui est fondamentalement un chemin de communication synchrone, ou vous pouvez créer des typologies de type async ROUTER-DEALER.

  • routage flexible des messages

Le "routage" signifie essentiellement qu'un message passe de A à B via un courtier. Cela est trivialement fait en 0mq et il existe un certain nombre de typologies qui prennent en charge des trucs comme ça ( http://zguide.zeromq.org/page:all#Basic-Reliable-Queuing-Simple-Pirate-Pattern =). Dans gRPC, le même type de typologie peut être créé avec une connexion de type "pub-sub" sur un flux. gRPC prend en charge la mise des métadonnées dans le message ( https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md ) qui vous permettra de `` router '' un message dans une file d'attente à partir de laquelle une connexion "pub-sub" pourrait tirer.

  • support d'équilibrage de charge

gRPC a un support de contrôle de santé ( https://github.com/grpc/grpc/blob/master/doc/health-checking.md ) mais parce que c'est HTTP/2, vous devriez avoir un équilibreur de charge HTTP/2 pour prendre en charge le contrôle d'intégrité. Ce n'est pas un gros problème, cependant, car vous pouvez lier le bilan de santé à un service HTTP/1.1 que l'équilibreur de charge appelle. 0mq est une connexion tcp, ce qui signifie qu'un équilibreur de charge vérifiera probablement une connexion de socket dans tcpmode pour vérifier la connexion. Cela fonctionne mais ce n'est pas aussi agréable. Encore une fois, vous pouvez obtenir le service 0mq avec un serveur Web HTTP/1.1 à partir duquel l'équilibreur de charge lit.

  • bien documenté

les deux sont bien documentés. La documentation de 0mq doit être lue pour bien comprendre la technologie et est plus d'un ascenseur plus élevé.

Voici les grandes différences:

  1. 0mq est un protocole TCP alors que gRPC est HTTP avec une charge utile binaire.
  2. 0mq vous demande de concevoir un protocole de trame (trame 1 = verison, trame 2 = charge utile, etc.), alors qu'une grande partie de ce travail est fait pour vous dans gRPC
  3. gRPC est converti de manière transparente en REST ( https://github.com/grpc-ecosystem/grpc-gateway ) tandis que 0mq nécessite une application middleware si vous voulez parler REST pour lui.
  4. gRPC utilise des certificats tls x509 standard (pensez aux sites Web) tandis que 0mq utilise un protocole de chiffrement/authentification personnalisé ( http://curvezmq.org/ ). Avant 4.x, il n'y avait pas de support de cryptage dans 0mq et si vous le vouliez vraiment, vous deviez plonger dans cette merde: https://wiki.openssl.org/index.php/BIO . (croyez-moi, ne le faites pas)
  5. 0mq peut créer des typologies assez malades ( https://github.com/zeromq/Majordomo ) ( https://rfc.zeromq.org/spec:7/MDP/ =) alors que gRPC est essentiellement client/serveur
  6. 0mq nécessite beaucoup plus de temps pour se construire et s'exécuter tandis que gRPC compile essentiellement des messages protobuf et importe le service dans votre code.
44
ascotan

Pas exactement pareil. gRPC est principalement destiné à l'interopérabilité des services hétérogènes, ZeroMQ (ZMQ/0MQ/ØMQ) est un cadre de messagerie de niveau inférieur. ØMQ ne spécifie pas la sérialisation de la charge utile au-delà des objets binaires binaires alors que gRPC choisit les tampons de protocole par défaut. ØMQ est à peu près bloqué sur la ou les mêmes machines entre les centres de données/clouds, alors que gRPC pourrait également fonctionner sur un vrai client (c'est-à-dire mobile ou web, il prend déjà en charge iOS). gRPC utilisant ØMQ pourrait être considérablement plus rapide et plus efficace pour les services dans le cloud/centre de données que la surcharge, la latence et la complexité de la chaîne de demande/réponse http2. Je ne sais pas comment (ou même si) gRPC TLS security est adéquat pour le cloud public et l'utilisation mobile/web, mais on pourrait toujours injecter des exigences de sécurité de bout en bout (ie libsodium) au niveau routeur/contrôleur de l'application/infrastructure d'application et s'exécutent en mode texte brut (ce qui empêcherait également OpenSSL fork BoringSSL de causer des maux de tête de maintenance en raison de failles en amont).

Pour les services à latence très élevée/à faible bande passante (c'est-à-dire la mission vers mars), on pourrait penser que RPC utilise un transport comme SMTP (c'est-à-dire la réplication alternative Active Directory) ou MQTT (c'est-à-dire Facebook Messenger, ZigBee, SCADA)

Bonus (hors sujet): Ce serait bien si gRPC avait d'autres modes de transport enfichables comme ØMQ (qui prend également en charge les sockets UNIX, TCP, PGM et inproc), car HTTP/2 n'est pas encore stable dans toutes les langues et il est plus lent que ØMQ. Et, cela vaut la peine d'examiner le nanomsg (en particulier dans le monde HFT) car il pourrait être étendu avec RDMA/SDP/MPI et rendu fou à faible latence/zéro copie/Infiniband.

27
user246672