Nous avons une grande application Ruby on Rails (25 millions d'utilisateurs mensuels), notre direction a décidé de réécrire dans Node.js, suis-je fou?

24

Veuillez me dire si:

  • Node.js rendra notre site plus rapide!
  • Node.js consommera moins de ressources serveur, nous pouvons économiser de l'argent!
  • Node.js nous rendra plus productifs!
  • Node.js signifie que nous pouvons partager du code JavaScript côté client et côté serveur.

Pour clarifier, nous réécrivons un serveur frontal, qui communiquera avec notre application Ruby on Rails existante en tant qu'API. Pendant ce temps, nous transformerons notre application Ruby on Rails en services.

Plus de détails sur l'architecture existante:

  • Memcached pour la mise en cache des partiels HTML
  • Redis pour la session et une mise en cache de données structurée
  • Maître unique MySQL , plusieurs esclaves
    • Il y a une grande table qui accepte beaucoup d'écritures (imaginez un sondage)
    • Sinon, lit principalement.
  • MongoDB pour certaines métadonnées
  • Ruby on Rails 3.0
  • nginx et licorne
user88487
la source
33
sheesh, toutes ces langues hipster. Une application php bien écrite évoluera facilement, les outils traditionnels fonctionnent, ne laissez pas ces hipsters vous dire le contraire.
Darknight
5
La question devrait être davantage du type "Les améliorations permettront-elles d'économiser suffisamment d'argent pour que l'entreprise en vaille la peine?" Cela pourrait économiser de l'argent sur 5 ans, mais la réécriture coûte cher et prend du temps - à moins que votre code ne soit un horrible gâchis horrible, je pense que vos gestionnaires sont fous
Mikey C
4
Si des réécritures sont envisagées, vous pouvez également envisager de déplacer votre frontal vers le javascript côté client, ce qui signifie que vous n'auriez plus de serveur frontal dynamique, juste des fichiers statiques.
Joeri Sebrechts
11
@Darknight gardez à l'esprit qu'à un moment donné, PHP était le langage hipster, et que les gens qui le montraient pouvaient être déployés dans des produits à succès ont favorisé son adoption, tandis que les développeurs Web Perl se moquaient des PHP hipsters.
9
Je suis très surpris que personne n'ait évoqué l'article de Joel Spolsky Choses que vous ne devriez jamais faire . Je ne dis pas que toutes les réécritures sont mauvaises, mais je suis d'accord avec @MikeyC qu'elles doivent être abordées avec une extrême prudence.
Dan Pichelman

Réponses:

22

La plupart des questions que vous posez ne répondent pas sans contexte, et sont plus ou moins théoriques étant donné que la direction a déjà fait le choix pour vous ... à moins que vous ne demandiez «devrais-je quitter et trouver un nouvel emploi face à tout ce changement ? '

Si vous allez vous durcir, je vous recommande de lire cet article sur le sujet: Comment survivre à une réécriture de fond en comble sans perdre votre santé mentale .

J'ai récemment commencé à réécrire un peu de logique de serveur dans node.js. La principale raison était qu'il est actuellement écrit en .NET et nous souhaitons migrer loin des environnements MS sur la piste.

Jusqu'à présent, mes expériences ont été positives, vous aurez une première courbe d'apprentissage avec tout ce qui n'est pas bloquant, mais une fois passé, c'est en fait assez amusant à coder. Je sais, FUN!

Il a cependant un côté sombre, chaque homme et son chien qui ont fait du développement frontal avec JavaScript - et ce serait tous les développeurs frontaux j'espère - deviennent un peu excités lorsque vous mentionnez que node.js est `` javascript côté serveur 'cependant, cela ne signifie pas que les développeurs frontaux auront l'expérience requise pour écrire de bonnes applications côté serveur.

Pour une chose que vous avez considérée, c'est qu'une erreur fatale fera tomber toute l'application en raison de sa nature non threadée, donc les enjeux sont un peu plus élevés et vous devez tout vérifier et attraper explicitement.

Pour ceux qui ont fait à la fois avant et arrière - et apprécient les deux - ne pas avoir à changer les contextes mentaux des langues frontales en langues frontales est un vrai bonus qui, à mon avis, augmentera la productivité de notre équipe sur la piste.

dave.zap
la source
"Pour une chose que vous avez à considérer, c'est qu'une erreur fatale entraînera la fermeture de toute l'application en raison de sa nature non threadée, donc les enjeux sont un peu plus élevés et vous devez explicitement vérifier et attraper tout" - Ce serait mon inquiétude.
2013
Oui, mon point principal avec cette déclaration était que seuls les développeurs frontaux ne sont généralement pas particulièrement pointilleux en ce qui concerne la gestion des exceptions. Allez, c'est déjà presque 2017!
dave.zap
8

Eh bien, je ne pense pas que la réécriture de l'application était une bonne idée, sauf si elle fonctionnait mal. Pour répondre à vos questions:

  1. Node.js n'est pas magique. Votre application compte énormément d'utilisateurs, il n'y a donc aucun moyen d'être certain qu'elle le rendra plus rapide.

  2. Eh bien, oui, Node.js consomme en fait moins de ressources serveur. Ainsi, non seulement vous pouvez économiser de l'argent sur les ressources, mais vous pouvez également faire plus avec les ressources existantes. Cela est principalement dû à la nature monothread de Node.js. Il n'y a pas de surcharge de threads supplémentaires.

  3. Encore une fois, Node.js n'est pas magique. Cela dit, il pourrait y avoir du vrai là-dedans. Node.js a une communauté très active qui a créé des centaines de modules pour chaque tâche possible. Il est donc très probable que la plupart du travail a été fait pour vous. Vous avez juste besoin d'assembler les pièces ensemble.

  4. Théoriquement, oui. Étant donné que Node.js est JavaScript, vous pouvez partager du code entre le client et le serveur. Mais je ne sais pas exactement ce qui sera partagé. Je n'ai écrit aucun morceau de code réutilisable sur un client. Les choses que nous faisons sur le serveur n'ont généralement rien à voir avec le client. Le plus important pour moi est le manque de changement de contexte. Je trouve plus facile de coder sur le client et le serveur dans une seule langue.

Étant donné que Node.js est monothread, sauf s'il est explicitement configuré pour le faire, il ne peut pas tirer parti de plusieurs processeurs .

Jetez également un œil aux commentaires. Ils fournissent un bon aperçu du fonctionnement de Node.js.

Akshat Jiwan Sharma
la source
16
Moins de ressources à cause d'un seul thread? Que pensez-vous que ces fils supplémentaires feraient?
Joe
@Joe, pour autant que je sache, ils s'additionneront. Dans le nœud js, il est préférable de supprimer une demande le plus rapidement possible, soit en la complétant en une fois, soit en la reprenant la prochaine fois. Pour être honnête, le nœud js est la seule technologie pour laquelle j'ai créé des applications de production. Je ne suis donc peut-être pas la meilleure personne pour la comparer avec d'autres technologies côté serveur. C'est pourquoi je me suis abstenu de faire des comparaisons et j'ai simplement mis ce que je pense savoir du nœud js dans ma réponse.
Akshat Jiwan Sharma
7
Oui, un seul thread limite certainement l'utilisation des ressources, car le serveur ne peut faire qu'une seule chose à la fois sur la boucle d'événement. Il limite également l'utilisation du serveur, car il ne peut faire qu'une seule chose à la fois. Il est très important de citer les fonctionnalités (monothread) et les avantages et les inconvénients plutôt que simplement les avantages. Node.js convient à certaines utilisations mais c'est une mauvaise idée pour d'autres. Lorsque votre serveur de noeud à thread unique a des problèmes de capacité, vous devrez peut-être ajouter une autre instance de noeud. Vous disposez maintenant d'un serveur multi-processus.
Joe
Je vois ce que vous voulez dire. Je mettrai à jour la réponse sous peu (lire après quelques recherches)
Akshat Jiwan Sharma
10
Ce n'est pas seulement une question de CPU. La raison pour laquelle il est important de traiter chaque demande le plus rapidement possible (dans un système à un seul thread sans aucune autre concurrence) est parce que le serveur ne peut pas traiter plusieurs demandes à la fois, donc chaque demande doit attendre jusqu'à ce que vous ayez fini de gérer tout les demandes dont il est saisi. La simultanéité, bien faite, signifie moins d'attente. L'utilisation de threads n'est pas intrinsèquement un drain de performance, et le thread unique (par défaut ou autrement) n'est pas un avantage de performance.
Peter Hosey