0

Wir versuchen derzeit 5000 TPS Treffer für eine unserer API zu erreichen. Wir verwenden Mongo Atlas 3.2.12 und NodeJS v6.10.2, bei jedem Treffer trifft es DB mit 3 Suchabfragen. Es ist ein ELB vorhanden und hinter dem ELB befinden sich zwei Instanzen des Mediums vom Typ Amazon EC2. Mit dem Apache Benchmark Tool haben wir herausgefunden, dass es in einer Sekunde nur die 68 Hits behandelt.Benötigen 5000 gleichzeitige API-Treffer auf AWS mit Node.js

unten ist die Apache Benchmark Tool Ausgabe -

Document Length:  748 bytes 

Concurrency Level:  1000 
Time taken for tests: 116.294 seconds 
Complete requests:  5000 
Failed requests:  4274 
    (Connect: 0, Receive: 0, Length: 4274, Exceptions: 0) 
Write errors:   0 
Total transferred:  5440980 bytes 
HTML transferred:  3830980 bytes 
Requests per second: 42.99 [#/sec] (mean) 
Time per request:  23258.823 [ms] (mean) 
Time per request:  23.259 [ms] (mean, across all concurrent requests) 
Transfer rate:   45.69 [Kbytes/sec] received 

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  6 418 823.7  10 2448 
Processing: 197 21032 7150.3 21848 35739 
Waiting:  197 21031 7150.3 21848 35739 
Total:  205 21450 7264.9 22052 36744 

Percentage of the requests served within a certain time (ms) 
    50% 22052 
    66% 24953 
    75% 26697 
    80% 27814 
    90% 30272 
    95% 31804 
    98% 33428 
    99% 34534 
100% 36744 (longest request) 

EDIT: Wir sind bereits Multi-Cluster verwendet wird. Aber wir sind nicht in der Lage, das gewünschte TPS zu erreichen, das 2000 in einer Sekunde ist. Derzeit haben wir den Server von t2 medium auf m4-large aufgerüstet. Jeder Vorschlag wäre eine große Hilfe.

Bitte schlagen Sie die Änderungen und die Architektur vor.

+0

Was ist Ihre Architektur? – Matt

Antwort

1

Ihr Engpass ist eindeutig nodeJS. Knoten verwaltet Parallelität mit einem Ereignisstapel, der in einem einzelnen Thread ausgeführt wird. Dies ist ideal für APIs, die die meiste Zeit darauf warten, dass IO beendet wird, da der Hauptprozess nicht blockiert wird und die Ereignisse im Stapel nach der Aufgabe gelöscht werden fertig. Das Problem mit dieser Architektur ist, wenn mehrere gleichzeitige Mid-Load-Verbindungen gleichzeitig in den Server gelangen, was zu einem Problem führt, das als Reosurce-Hunger bekannt ist. In diesem Fall erhält der Ereignisstapel mehr und mehr Einträge, und die Schleife kann sie nicht alle ordnungsgemäß verarbeiten, wodurch die Verarbeitung verlangsamt und sogar ein Überlauf des Heapspeichers oder ein unerwartetes Herunterfahren verursacht wird.

Um dies zu beheben ohne Ihre Architektur zu wissen, i zu einem reiferen wechseln empfehlen würde (aus der tecnical Sicht) tecnologies wie Go, Ihre DB und API Aufspalten mehr staatenlos API Prozesse einrichten und mit ein Load Balancer, um die Aufrufe an die weniger ausgelastete API-Instanz umzuleiten.

wäre toll, mehr Informationen über Ihre Architektur zu haben.

+1

Ich würde nicht empfehlen, die Fundament-Architektur zu ändern, da es bessere Optionen gibt, z. B. Knoten-Cluster. –

+0

@AliAshraf, stimme ich völlig zu, aber ich muss empfehlen, was ich tun würde, da OP uns kein Detail gab, er könnte bereits Knoten Cluster verwenden, ich ging einfach zu "einem guten Ansatz" statt zu versuchen, ein zu beheben unbekannter Bogen – PRDeving

0

Wie AB resultiert in Jede Anfrage dauert etwa 23 Sekunden (Mittelwert). Haben Sie Last oder RAM-Spike auf dem API-Server beobachtet? Sie können Knotenarbeiter oder Server erhöhen, um mehr Anfragen zu bearbeiten.

Time per request: 23258.823 [ms] (mean)

Imp. Check time time consume durch eine einzige Abfrage in der Datenbank Gibt es einen Index vorhanden oder nicht?

+0

Alle Abfragefelder haben einen Index und wir haben den Thread-Pool mit UV_THREADPOOL_SIZE auf 128 erhöht, aber keine Unterschiede gesehen. – Vikalp

+0

Zuerst müssen Sie überprüfen, wie viel Erfolg Ihre App auf t2 medium/m4-große Einzelinstanz verarbeiten kann. entsprechend können Sie die Anzahl der Instanzen erhöhen. Und haben Sie die Latenz bei Load-Balancer-Metriken überprüft? Einige Zeit, die unsere Anwendung für jeden Anruf mehr Zeit benötigt, um Anrufe zu beantworten, und Anrufe wegen RTO fehlgeschlagen sind. Vielleicht ist das hilfreich. Sie können mich direkt kontaktieren. Gerne helfen wir Ihnen –

0

Verwenden Sie Knoten Cluster, wenn Sie einen Multi-Core-Prozessor haben und sehen, was passiert.

https://nodejs.org/api/cluster.html#cluster_cluster

Beispiel für die Verwendung in diesem Artikel: https://www.sitepoint.com/how-to-create-a-node-js-cluster-for-speeding-up-your-apps/

+0

Wir verwenden bereits Multi-Cluster. Aber wir sind nicht in der Lage, das gewünschte TPS zu erreichen, das 2000 in einer Sekunde ist. Derzeit haben wir den Server von t2 medium auf m4-large aufgerüstet. Jeder Vorschlag wäre eine große Hilfe. – Vikalp

0

Cant Sie Setup Ihre Architektur so etwas wie Docker, Schwarm, UCP zu verwenden und Scale-up gerade? Sie haben einen Master und so viele Slaves, wie Sie skalieren müssen.

Verwandte Themen