Ich weiß nicht, ob dies mit Koa verwandt ist, oder ist ein Problem von einem anderen NPM-Modul oder etwas anderes. Ich werde von hier aus beginnen. Wenn dies der falsche Ort ist, werde ich es an den entsprechenden Ort verschieben. Ich muss es nur irgendwo schreiben, weil es mich verrückt macht.Seltsame ECONNRESET-Fehler Ich kann nicht herausfinden,
Also zum Problem. Ich habe REST api in koa v1 geschrieben. Wir führen den Knotenserver im Docker-Image aus. Einer der Endpunkte, den wir haben, startet den Import und gibt den Status 200 mit der Nachricht: "Import gestartet" zurück, und wenn der Import abgeschlossen ist, senden wir Slack-Nachricht, um uns zu benachrichtigen.
Also zuerst habe ich den Server auf meinem lokalen Rechner getestet, alles funktioniert (Endpunkt wirft keine Fehler). Dann habe ich Docker Image erstellt. Ich starte Container Localy, alles funktioniert (Endpunkt wirft keine Fehler). Ich stelle mein Bild in die Mesos-Umgebung, alles funktioniert soweit. Container läuft, jeder Endpunkt funktioniert neben dem Import-Endpunkt. Wenn ich es anrufe, nach ein paar Sekunden (5 bis 10), bekomme ich ECONNRESET
Fehler, der laufende Container wird getötet und neue laufende Instanz gestartet. Der Import ist beendet.
Am Anfang haben wir dem Docker Container 128 MB RAM zugewiesen und das scheint genug zu sein. Nachdem ein Importfehler aufgetreten ist, dachten wir vielleicht, dass OOM den Prozess beendet hat. Daher haben wir uns entschieden, dmesg zu überprüfen, und wir konnten keine Protokolleinträge finden, die sich auf die OOM und den Prozess des laufenden Containers beziehen. Dann haben wir die RAM-Auslastung des Containers localy (mit htop) überprüft und herausgefunden, dass es aprox verwendet. 250+ MB, also haben wir beschlossen, mehr RAM in Marathon-Konfiguration (512 MB) hinzuzufügen. Das hat aber nicht geholfen, der selbe Fehler ist aufgetreten.
Da der Fehler nicht explizit genug war, installierten wir longjohn
Modul, so konnten wir genauere Fehlermeldung erhalten. Das brachte uns nur ein bisschen mehr Informationen, aber nicht so viel wie wir dachten.
Error: read ECONNRESET
at exports._errnoException (util.js:1026:11)
at TCP.onread (net.js:569:26)
---------------------------------------------
at Application.app.callback (/src/node_modules/koa/lib/application.js:130:45)
at Application.app.listen (/src/node_modules/koa/lib/application.js:73:39)
at Promise.then.result (/src/server.js:97:13)
Error: read ECONNRESET
at exports._errnoException (util.js:1026:11)
at TCP.onread (net.js:569:26)
Linie 97 des server.js ist:
96:if(!module.parent) {
97: app.listen(port, (err) => {
98: if (err) {
99: console.error('Server error', err);
100: }
101: console.log('Listening on the port', port);
102: });
103:}
Raue Logik des Import-Endpunkt: Was passiert also genau in der Endpunktlogik. Wir verwenden postgres npm Modul pg
. Wir geben pg.Pool
an den Kontext weiter, damit wir ihn später in unseren Modellen verwenden können. Wir führen die in present eingekapselte Einfügeabfrage aus und drücken Versprechen im Array. Es gibt ungefähr 2700+ Aufzeichnungen. Später machen wir Promise.all
auf dem Array von Versprechen und mit then
senden wir die Nachricht an Slack. Wie Sie sehen können, weiß ich nicht, ob der Fehler mit koa
oder pg
oder etwas anderem zusammenhängt. Was interessanter ist, ist, dass Localy alles funktioniert (Node-Server sowie in Docker-Container), aber auf Mesos nicht. Ich wäre dankbar für irgendwelche Einsichten oder Tipps, wie man herausfinden kann, was falsch ist.
- Version von KOA NPM-Modul: 1.2.0
- Version pg NPM-Modul: 6.1.0
- Version von Postgres 9.5
- Version von Mesos: 1.0.1
EDIT:
Dank einem anderen Entwickler, fanden wir heraus, was das war Ursache für den Fehler. Wir haben alle Verbindungen im Pool verwendet, als ein Import ausgeführt wurde.Als der Marathon zum Zeitpunkt des Imports den Dienststatus anforderte, versuchte der Dienst eine Verbindung mit der Datenbank herzustellen, um die Verbindung zu testen, und zu diesem Zeitpunkt wurde die Verbindung zur Datenbank beendet. Der Service wurde ungesund und der Marathon startete den Dienst neu. Wir haben den Importcode neu berechnet. Wir beschränken die Anzahl der Poolverbindungen.
Mit freundlichen Grüßen.
Ich habe fast das gleiche genaue Problem! Postgres und pg verwenden. – Yesha
Hast du das schon behoben? – Yesha
Nein, danach hatte ich keine Zeit und keine zusätzliche Idee, was ich noch überprüfen oder beweisen konnte. – daniyel