2016-12-16 6 views
2

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.

+0

Ich habe fast das gleiche genaue Problem! Postgres und pg verwenden. – Yesha

+0

Hast du das schon behoben? – Yesha

+0

Nein, danach hatte ich keine Zeit und keine zusätzliche Idee, was ich noch überprüfen oder beweisen konnte. – daniyel

Antwort

0

Dank eines anderen Entwicklers haben wir herausgefunden, was die Ursache für den Fehler war. 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.

0

Laut this github issue ist dies ein Fehler, der durch tiny-lr verursacht wird.

Es scheint, dass ein Downgrade auf Version 0.2.1 es stoppt, aber das ist normalerweise eine Abhängigkeit von anderen Paketen, die Sie verwenden, dass Sie keine Kontrolle über haben. Sie könnten in der Lage sein, den Fehler zu filtern, indem alle Fehler außer dieser Anzeige, wie zum Beispiel:

if (error.code !== 'ECONNRESET') { console.log(error) } 

Die Frage ist noch offen, und stammt aus dem 27. Oktober 2016. Sie wissen nicht, ob es repariert wird oder nicht. Aber was das Feedback betrifft, scheint es kein gefährlicher Fehler zu sein oder irgendeine Auswirkung zu haben. Aber heh, ich würde lieber auch meine reparieren, wenn es einen Weg gäbe.

Verwandte Themen