6 kleine Tipps zur Vorbereitung Ihres NodeJS auf hohe Belastungen

Der Gesichtserkennungsdienst Look-A-Like bediente Tausende von Benutzern gleichzeitig.

Die Entwicklung von NodeJS als Hobby ist ein Vergnügen, aber wenn es um die Produktion für viele Benutzer geht, sollten Sie einige Dinge wissen, um lange Reaktionen und Störungen zu vermeiden.


Im Rahmen unserer Arbeit bei MyHeritage haben wir den Doppelgänger-Service für Eurovision 2019 entwickelt, mit dem Sie durch Hochladen eines Selfies herausfinden können, welche der Teilnehmer Ihnen am ähnlichsten sind.


Neben der Logik der Gesichtserkennung stellte die Anwendung eine äußerst klare Anforderung: Sie musste Zehntausende von gleichzeitigen Benutzern bedienen, da Millionen von Menschen auf der ganzen Welt Eurovision sehen.


Sehr schnell haben wir festgestellt, dass der Load Balancer vor der mit Auto Scaling konfigurierten Anwendung für die Fehlertoleranz nicht ausreicht. Folgendes hat uns sehr geholfen:


  1. Hoffen Sie auf das Beste, aber machen Sie sich bereit für das Schlimmste: Messen Sie, wie viele gleichzeitige Benutzer Ihre Anwendung in Zeit X (in einem Fall) bereitstellen können. In unserem Fall haben Tests beispielsweise gezeigt, dass wir 10 Sekunden lang 200 gleichzeitige Benutzer in jeder EC2-Instanz bedienen können. Als wir herausfanden, dass wir 10.000 gleichzeitige Benutzer bedienen sollten, mussten wir nur 50 Server für den Balancer vorbereiten. Für den Test haben wir ein hervorragendes Tool namens JMeter verwendet .

    Dieses Tutorial hat bei der Vorbereitung der Messungen sehr geholfen.
  2. Vermeiden Sie Sperren: Blockierungsvorgänge (wie fs.readSync ) sind verlockend, da der Code sauberer aussieht, aber die Leistung buchstäblich fs.readSync . Verwenden Sie stattdessen asynchrone / await Vorgänge, da die CPU während des asynchronen Vorgangs für andere Aufgaben verfügbar ist (siehe Ereignisschleife ).

    Vorher: const res = fs.readSync('file.txt');
    const res = fs.readSync('file.txt');
    const res = await fs.readAsync('file.txt'); : const res = await fs.readAsync('file.txt');
  3. Erhöhen Sie das Speicherlimit: Der Node ist standardmäßig auf 1 GB konfiguriert. Wenn der Server beispielsweise für Ihre Anwendung auf 4 GB zugreifen kann, müssen Sie das maximale Speicherlimit mithilfe der CLI mit dem folgenden Flag manuell festlegen: --max-old-space-size
    --max-old-space-size
    Beispiel: node --max-old-space-size=4096 server.js
  4. Stellen Sie sicher, dass Sie alle Prozessorkerne verwenden: Standardmäßig wird Node im selben Thread ausgeführt. Wenn Sie keine Konfiguration konfiguriert haben, die mehrere Threads ausführen würde, sparen Sie Geld, indem Sie einen Server mit 1 Kern auswählen.
  5. Reduzieren Sie die Anzahl der Aufrufe der Anwendung: Konfigurieren Sie erzwungenes HTTPS und alle Weiterleitungen so hoch wie möglich (z. B. auf Proxy-Ebene). Auf diese Weise kann die Anwendung nicht durch überflüssiges Material abgelenkt werden und ist daher für wirklich wichtige Anforderungen besser zugänglich.
  6. Fehlerbehandlung : Verwenden Sie die Protokollierung, z. B. Logz.io/AWS CloudWatch, um Fehler zu verfolgen, die zu Anwendungsfehlern führen können. Melden Sie KEINE Dienste wie Slack über alles, da Nachrichten normalerweise in großen Mengen gesendet werden und einen Kanal leicht verstopfen können. Wir haben eine ausgezeichnete Bibliothek namens Winston zum Anmelden bei NodeJS verwendet.

In unserem Fall führten diese Tipps zu einer Verzehnfachung der Produktivität und trugen dazu bei, die Produktionsumgebung sauber zu halten, selbst wenn Sie Tausende von Benutzern gleichzeitig bedienen mussten.


Danke fürs Lesen.

Source: https://habr.com/ru/post/de456036/


All Articles