2016-03-31 15 views
0

Vor kurzem sah ich ein Stück node.js Code wie unten, die als eigenständiger Dienst ausgeführt werden soll, ohne jedes Mal neu zu starten, wenn neue Anforderungen empfangen werden:Wie funktioniert der nicht blockierende mysql-Client?

switch(action) { 
    case 'a': 
     connectMysql(function(mysqlConnection) { 
      // some queries X 
     }); 
     break; 
    case 'b': 
     connectMysql(function(mysqlConnection) { 
      // some queries Y 
     }); 
     break; 
    /***** more actions *****/ 
} 

Es öffnet sich eine neue Verbindung MySQL jedes Mal für jede Aktion, und der, der dies geschrieben hat, glaubt, dass dieser Ansatz sicherstellen könnte, dass Abfragen parallel ausgeführt werden und sich nicht gegenseitig blockieren, wenn es gleichzeitig einen großen Anforderungsbetrag gibt.

Das verwirrte mich wirklich, weil ich dachte, der mysql-Client für node.js ist nicht blockierend, was nichts blockiert.

Wenn irgendwelche Chancen, dass die Abfragen festhängen, der Grund könnte der Prozess war zu viele Anfragen zu behandeln, und mehr mysql Verbindungen wird definitiv nicht helfen.

Oder bedeutet ein nicht blockierender Client nur, dass er Abfragen asynchron sendet, aber die Abfragen werden schließlich auf der mysql-Serverseite blockiert, wenn zu viele Abfragen vorhanden sind?

Antwort

1

Das MySQL-Protokoll ermöglicht nicht Multiplexen von Anfragen vor allem, weil, wenn Sie eine Verbindung zum Server, Sie nehmen nur einen einzigen Thread und es gibt nur höchstens eine hervorragende Abfrage pro Thread zu einem bestimmten Zeitpunkt. Daher implementieren MySQL-Module für Knoten typischerweise eine Art von Warteschlange als Annehmlichkeit.

Einige der MySQL-Module bieten integriertes Verbindungs-Pooling, mit dem Sie das Limit für eine Abfrage pro Verbindung umgehen und gleichzeitig die Anzahl der Verbindungen zum Server begrenzen können (um nicht zu überlasten) der Server und/oder die Socket-Dateideskriptoren lokal auslaufen lassen). IMHO schließlich ist die Pooling-Option die beste Lösung, so weit die Nebenläufigkeit geht.

Der nicht blockierende Aspekt bedeutet nur, dass Sie nicht aufhören, etwas anderes zu tun, während Sie auf die Beendigung einer Abfrage warten. Dies ermöglicht Ihnen, andere Dinge zu tun, während Sie auf die Abfrage warten, z. B. auf andere Web-Server-Anfragen reagieren, Timer zünden usw.

+0

Vielen Dank für Ihre Antwort, nur um sicherzustellen, dass ich diese richtig bekomme. Also im Grunde mysql Server führen Abfrage nur sequenziell von einer Verbindung, einige Clients werden eine Warteschlange oder einen Verbindungspool, um mit diesem Problem mit mehreren Abfragen Schritt zu halten. Und der Code, den ich gepostet habe, hat dieses Problem irgendwie gelöst, aber das Erstellen eines Verbindungspools wäre eine bessere Option, anstatt unbegrenzte Verbindungen zu öffnen, oder? – nevermind

+1

Korrekt und korrekt. – mscdex

Verwandte Themen