Question

Nous sommes à la recherche de solutions de transport / protocole et étions sur le point de faire divers tests de performance. Je me suis donc demandé si je devais vérifier auprès de la communauté si elle l'avait déjà fait:

Quelqu'un a-t-il effectué des tests de performances de serveur pour des services d'écho simples ainsi que des techniques de sérialisation / désérialisation pour différentes tailles de messages en comparant les tampons EJB3, Thrift et Protocol Buffers sous Linux?

Principalement, les langages seront Java, C / C ++, Python et PHP.

Mise à jour: Je suis toujours très intéressé par cette question. Si quelqu'un a déjà effectué d'autres tests, merci de me le faire savoir. En outre, référence très intéressante montrant JSON compressé effectuant une performance similaire / meilleure que celle de Thrift / Protocol Buffers , donc je jette JSON dans cette question aussi.

Était-ce utile?

La solution

La dernière comparaison disponible ici sur le thrift-protobuf-compare . Il comprend de nombreuses autres bibliothèques de sérialisation.

Autres conseils

Je suis en train d'écrire du code dans un projet open source nommé thrift -protobuf-compare en comparant protobuf et thrift. Pour l'instant, il aborde quelques aspects de la sérialisation, mais j'ai l'intention d'en couvrir davantage. Les résultats (pour Thrift et Protobuf ) sont discutés dans mon blog, je vais en ajouter plus quand je vais y arriver. Vous pouvez consulter le code pour comparer l'API, le langage de description et le code généré. Je serai heureux d'avoir des contributions pour réaliser une comparaison plus complète.

J'ai testé les performances de PB avec plusieurs autres formats de données (xml, json, sérialisation d'objet par défaut, hessian, un propriétaire) et des bibliothèques (jaxb, infoset rapide, écrit à la main) pour la tâche de liaison de données (lecture et écrit), mais le format de thrift n’a pas été inclus. Les performances pour les formats avec plusieurs convertisseurs (comme xml) présentaient une variance très élevée, allant de très lente à très rapide. La corrélation entre les revendications des auteurs et la performance perçue était plutôt faible. Surtout pour les colis qui ont fait les réclamations les plus folles.

Pour ce qui en vaut la peine, j’ai trouvé que la performance de PB était un peu exagérée (en général, pas par ses auteurs, mais par d’autres personnes qui savent seulement qui l’a écrit). Avec les paramètres par défaut, il n’a pas battu l’alternative texte xml la plus rapide. Avec le mode optimisé (pourquoi n’est-ce pas le mode par défaut?), C’était un peu plus rapide, comparable au package JSON le plus rapide. Hessian était plutôt rapide, json textuel aussi. Le format binaire propre (sans nom ici, c’était interne à la société) était le plus lent. La sérialisation des objets Java était rapide pour les messages plus volumineux, moins pour les petits objets (c'est-à-dire noverhead fixé par opération). Avec PB, la taille des messages était compacte, mais compte tenu de tous les compromis que vous devez faire (les données ne sont pas auto-descriptives: si vous perdez le schéma, vous perdez des données; il y a bien sûr des index et des types de valeur, mais ce que vous avez Si vous le souhaitez, effectuez un reverse-engineering sur les noms de champs), je ne le choisirais personnellement que pour des cas d'utilisation spécifiques - système à couplage étroit, sensible à la taille, dont l'interface / le format ne change jamais (ou très très rarement).

Mon opinion à ce sujet est que (a) la mise en œuvre compte souvent plus que la spécification (du format de données), (b) de bout en bout, les différences entre les meilleurs composants (pour différents formats) ne sont généralement pas suffisantes. dicter le choix. Autrement dit, vous feriez mieux de choisir le format + API / lib / framework que vous préférez (ou le meilleur support d’outil), de trouver la meilleure implémentation et de voir si cela fonctionne assez vite. Si (et seulement si!) Non, considérez la meilleure alternative suivante.

ps. Pas sûr de ce que serait EJB3 ici. Peut-être simplement de la sérialisation Java?

L’une des choses qui se trouvent tout en haut de mon " to-do " La liste pour les PB consiste à porter le test de performance interne du tampon de protocole interne de Google. Il s’agit principalement de prendre les formats de message confidentiels et de les transformer en formats totalement fades, puis de faire de même pour les données.

Cela fait, j'imagine que vous pouvez créer les mêmes messages dans Thrift, puis comparer les performances.

En d'autres termes, je n'ai pas encore les données pour vous - mais j'espère dans les prochaines semaines ...

Si la performance nette brute est la cible, rien ne vaut IIOP (voir RMI / IIOP). Plus petite empreinte possible - uniquement des données binaires, pas de balisage du tout. La sérialisation / désérialisation est également très rapide.

Comme il s'agit de IIOP (c'est-à-dire CORBA), presque toutes les langues ont des liaisons.

Mais je suppose que les performances ne sont pas la seule condition requise, n'est-ce pas?

Pour appuyer le point de vue de Vladimir sur le programme IIOP, voici un test de performance intéressant, qui devrait fournir des informations supplémentaires par rapport aux critères de référence de Google, car il compare Thrift à CORBA. (Performance_TIDorb_vs_Thrift_morfeo.pdf // le lien n'est plus valide) Pour citer l'étude:

  
      
  • Thrift est très efficace avec les petites   données (types de base comme opération   arguments)
  •   
  • Les transports Thrifts ne sont pas aussi efficaces que CORBA avec moyen   données volumineuses (struct et > complexes   types > 1 kilo-octets).
  •   

Une autre limite étrange, sans rapport avec les performances, est que Thrift est limité à ne renvoyer que plusieurs valeurs sous forme de struct - bien que cela, tout comme les performances, puisse sûrement être amélioré.

Il est intéressant de noter que Thrift IDL correspond étroitement à CORBA IDL, bien. Je n'ai pas utilisé Thrift, cela semble intéressant en particulier pour les messages de petite taille, et l'un des objectifs de la conception visait une installation moins lourde. Voilà donc d'autres avantages de Thrift. Cela étant dit, CORBA a une mauvaise réputation, il existe de nombreuses excellentes implémentations telles que omniORB , par exemple, avec des liaisons. pour Python, faciles à installer et à utiliser.

Modifié: le lien Thrift et CORBA n’est plus valide, mais j’ai trouvé un autre document utile du CERN. Ils ont évalué les remplaçants de leur système CORBA et, bien qu'ils aient a évalué Thrift , ils ont finalement opté pour ZeroMQ. Bien que Thrift ait réalisé les tests de performance les plus rapides, à 9 000 msg / s contre 8 000 (ZeroMQ) et 7 000+ RDA (basé sur CORBA), ils ont choisi de ne pas tester Thrift plus loin en raison d'autres problèmes, notamment:

  

Il s'agit toujours d'un produit immature avec une implémentation buggy

J'ai effectué une étude sur l'intégration de Spring-Boot, des mappeurs (manuel, Dozer et MapStruct), Thrift, REST, SOAP et des tampons de protocole pour mon travail.

Côté serveur: https://github.com/vlachenal/webservices-bench

Côté client: https://github.com/vlachenal/webservices-bench-client

Ce n'est pas fini et a été exécuté sur mes ordinateurs personnels (je dois demander des serveurs pour compléter les tests) ... mais les résultats peuvent être consultés sur:

En conclusion:

  • Thrift offre les meilleures performances et est facile à utiliser
  • Le service Web RESTful avec le type de contenu JSON est assez proche de la performance Thrift, est le "navigateur prêt à être utilisé". et est assez élégant (de mon point de vue)
  • SOAP a de très mauvaises performances mais offre le meilleur contrôle des données
  • Les tampons de protocole ont de bonnes performances ... jusqu'à 3 appels simultanés ... et je ne sais pas pourquoi. C’est très difficile à utiliser: j’abandonne (pour l’instant) mon travail avec MapStruct et je n’essaye pas avec Dozer.

Les projets peuvent être complétés par des demandes d'extraction (pour des corrections ou d'autres résultats).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top