Wir haben eine große Ruby on Rails-Anwendung (25 Millionen Benutzer pro Monat). Unser Management hat beschlossen, Node.js umzuschreiben. Bin ich verrückt?

24

Bitte sag mir ob:

  • Node.js wird unsere Seite schneller machen!
  • Node.js wird weniger Serverressourcen verbrauchen, wir können Geld sparen!
  • Node.js macht uns produktiver!
  • Node.js bedeutet, dass wir clientseitigen und serverseitigen JavaScript-Code freigeben können.

Zur Verdeutlichung schreiben wir einen Frontend-Server neu, der mit unserer vorhandenen Ruby on Rails-Anwendung als API kommuniziert. In der Zwischenzeit werden wir unsere Ruby on Rails-Anwendung in Services umgestalten.

Weitere Details zur bestehenden Architektur:

  • Memcached für HTML partials Caching
  • Redis für die Sitzung und einige strukturierte Daten-Caching
  • MySQL Single Master, mehrere Slaves
    • Es gibt einen großen Tisch, der viele Schreibvorgänge akzeptiert (stellen Sie sich eine Umfrage vor).
    • Ansonsten liest meistens.
  • MongoDB für einige Metadaten
  • Ruby on Rails 3.0
  • Nginx und Einhorn
user88487
quelle
33
Meine Güte, all diese Hipster-Sprachen. Eine gut geschriebene PHP-Anwendung lässt sich leicht skalieren, die traditionellen Tools funktionieren. Lassen Sie sich von diesen Hipstern nicht etwas anderes sagen.
Darknight
5
Die Frage sollte eher lauten: "Sparen die Verbesserungen dem Unternehmen genug Geld, damit es sich lohnt?" Es könnte Geld sparen über 5 Jahre, aber das Umschreiben ist teuer und zeitaufwändig - es sei denn, Ihr Code ist ein schreckliches Durcheinander. Ich denke, Ihre Manager sind verrückt
Mikey C
4
Wenn Änderungen in Betracht gezogen werden, können Sie Ihr Front-End auch auf clientseitiges Javascript verlagern. Dies bedeutet, dass Sie keinen dynamischen Front-End-Server mehr haben, sondern nur noch statische Dateien.
Joeri Sebrechts
11
@Darknight Bedenken Sie, dass PHP zu einem bestimmten Zeitpunkt die Hipster-Sprache war und dass die Leute, die zeigten, dass es in erfolgreichen Produkten eingesetzt werden konnte, für seine Annahme förderten, während die Perl-Webentwickler die PHP-Hipster anstachelten.
9
Ich bin sehr überrascht, dass niemand den Joel Spolsky-Artikel Dinge angesprochen hat, die Sie niemals tun sollten . Ich sage nicht, dass alle Umschreibungen schlecht sind, aber ich stimme @MikeyC zu, dass sie mit äußerster Vorsicht behandelt werden sollten.
Dan Pichelman

Antworten:

22

Die meisten Fragen, die Sie stellen, lassen sich ohne Kontext nicht beantworten und sind mehr oder weniger umstritten, da das Management bereits die Wahl für Sie getroffen hat ... es sei denn, Sie fragen sich, ob ich kündige und angesichts all dieser Veränderungen einen neuen Job finde ?

Wenn Sie es schwer haben, empfehle ich Ihnen, diesen Beitrag zum Thema zu lesen: So überleben Sie einen von Grund auf neu geschriebenen Schreibvorgang, ohne dabei den Verstand zu verlieren .

Ich habe kürzlich damit begonnen, ein wenig Serverlogik in node.js umzuschreiben. Der Hauptgrund war, dass es derzeit in .NET geschrieben ist und wir aus MS-Umgebungen heraus migrieren möchten.

Meine bisherigen Erfahrungen waren positiv, Sie werden eine anfängliche Lernkurve mit all dem Nicht-Blockieren davon haben, aber wenn Sie einmal vorbei sind, ist es tatsächlich ziemlich lustig, zu codieren. Ich weiß, SPASS!

Es hat jedoch eine dunkle Seite, jeder Mann und sein Hund, der Front-End-Entwicklung mit JavaScript durchgeführt hat - und das ist hoffentlich jeder Front-End-Entwickler -, wird ein wenig aufgeregt, wenn Sie erwähnen, dass node.js serverseitiges Javascript ist Dies bedeutet jedoch nicht, dass Front-End-Entwickler über die erforderliche Erfahrung verfügen, um gute serverseitige Apps zu schreiben.

Zum einen müssen Sie berücksichtigen, dass ein schwerwiegender Fehler die gesamte App zum Erliegen bringt, da dies nicht auf Threads beruht. Die Einsätze sind also etwas höher, und Sie müssen alles explizit überprüfen und abfangen.

Für diejenigen, die sowohl Front als auch Back gemacht haben - und beide genießen -, ist es ein echter Bonus, die mentalen Kontexte nicht von Front-End- zu Back-End-Sprachen wechseln zu müssen.

dave.zap
quelle
"Zum einen ist zu bedenken, dass ein schwerwiegender Fehler die gesamte App zum Erliegen bringt, da sie nicht vom Thread stammt. Die Einsätze sind also etwas höher und Sie müssen alles explizit überprüfen und abfangen." - Das wäre meine Sorge.
Tentimes
Ja, mein Hauptpunkt bei dieser Aussage war, dass nur Front-End-Entwickler in der Regel nicht besonders pingelig sind, wenn es um die Behandlung von Ausnahmen geht. Komm schon, es ist schon fast 2017!
Dave.zap
8

Nun, ich denke nicht, dass das Umschreiben der Anwendung eine gute Idee war, es sei denn, sie lief schlecht. Um Ihre Fragen zu beantworten:

  1. Node.js ist keine Zauberei. Ihre Anwendung hat eine große Anzahl von Benutzern, sodass Sie nicht sicher sein können, dass sie dadurch schneller wird.

  2. Ja, Node.js verbraucht tatsächlich weniger Serverressourcen. Sie können also nicht nur Ressourcen sparen, sondern auch die vorhandenen Ressourcen besser nutzen. Dies liegt hauptsächlich an der Singlethread-Funktion von Node.js. Es gibt keinen Overhead für zusätzliche Threads.

  3. Wieder ist Node.js keine Zauberei. Davon abgesehen könnte etwas Wahres dran sein. Node.js hat eine sehr aktive Community, die Hunderte von Modulen für jede mögliche Aufgabe erstellt hat. Es ist also sehr wahrscheinlich, dass der größte Teil der Arbeit für Sie erledigt wurde. Sie müssen nur die Teile zusammenpassen.

  4. Theoretisch ja. Da Node.js JavaScript ist, können Sie Code zwischen dem Client und dem Server freigeben. Aber ich weiß nicht genau, was geteilt wird. Ich habe keinen Code geschrieben, der auf einem Client wiederverwendbar war. Dinge, die wir auf dem Server tun, haben normalerweise nichts mit dem Client zu tun. Wichtiger für mich ist der fehlende Kontextwechsel. Ich finde es einfacher, sowohl auf dem Client als auch auf dem Server in einer einzigen Sprache zu programmieren.

Da Node.js ein einzelner Thread ist, können nicht mehrere CPUs ausgenutzt werden , sofern dies nicht explizit konfiguriert wurde .

Schauen Sie sich auch die Kommentare an. Sie bieten einen guten Einblick in die Funktionsweise von Node.js.

Akshat Jiwan Sharma
quelle
16
Weniger Ressourcen aufgrund eines einzelnen Threads? Was denkst du, würden diese zusätzlichen Threads tun?
Joe
@ Joe, soweit ich weiß, dass sie sich addieren werden. Bei Knoten js ist es eine bewährte Methode, eine Anforderung so schnell wie möglich zu löschen. Entweder, indem Sie sie auf einmal ausfüllen. Oder indem Sie sie beim nächsten Mal fortsetzen. Um ehrlich zu sein, bei Knoten js ist die einzige Technologie, für die ich Produktionsanwendungen erstellt habe. Daher bin ich möglicherweise nicht die beste Person, um sie mit anderen serverseitigen Technologien zu vergleichen. Aus diesem Grund habe ich auf Vergleiche verzichtet und nur das eingegeben, wovon ich denke, dass ich von Knoten js weiß meine Antwort.
Akshat Jiwan Sharma
7
Ja, ein einzelner Thread schränkt die Ressourcennutzung mit Sicherheit ein, da der Server in der Ereignisschleife nur eine Aktion gleichzeitig ausführen kann. Es schränkt auch die Servernutzung ein, da nur eines gleichzeitig möglich ist. Es ist sehr wichtig, Features (mit einem Thread) und Vor- und Nachteile zu zitieren und nicht nur die Vorteile. Node.js ist für einige Zwecke geeignet, für andere jedoch eine schlechte Idee. Wenn Ihr Single-Threaded-Knotenserver Kapazitätsprobleme aufweist, müssen Sie möglicherweise eine weitere Knoteninstanz hinzufügen. Jetzt haben Sie einen Multiprozess-Server.
Joe
Ich werde die Antwort in Kürze aktualisieren (nach einigen Recherchen
nachlesen
10
Es geht nicht nur um CPUs. Der Grund, warum es wichtig ist, jede Anfrage so schnell wie möglich zu bearbeiten (in einem Singlethread-System ohne andere Parallelität), ist, dass der Server nicht mehrere Anfragen gleichzeitig bearbeiten kann, sodass jede Anfrage warten muss, bis Sie die gesamte Bearbeitung abgeschlossen haben die Anfragen davor. Gleichzeitigkeit bedeutet weniger Wartezeit. Die Verwendung von Threads ist von Natur aus kein Leistungsverlust, und Single-Threading (standardmäßig oder auf andere Weise) ist kein Leistungsvorteil.
Peter Hosey