Node.js + socket.io, Cluster / Multithreading – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self Node.js + socket.io, Cluster / Multithreading Sun, 28 Jan 18 11:21:24 Z https://forum.selfhtml.org/self/2018/jan/28/node-punkt-js-plus-socket-punkt-io-cluster-strich-multithreading/1712865#m1712865 https://forum.selfhtml.org/self/2018/jan/28/node-punkt-js-plus-socket-punkt-io-cluster-strich-multithreading/1712865#m1712865 <p>Guten Morgen zusammen,</p> <p>Ich habe gestern das Cluster Modul von Node.js gefunden und würde dies gern in mein bestehendes Projekt implementieren. Dabei treten aber einige Probleme auf und ich hoffe jemand kann mir weiterhelfen.</p> <p>Etwa folgendes läuft seit geraumer Zeit auf meinem Raspi problemlos:</p> <pre><code class="block language-javascript"><span class="token keyword">var</span> port <span class="token operator">=</span> process<span class="token punctuation">.</span>env<span class="token punctuation">.</span><span class="token constant">PORT</span> <span class="token operator">||</span> <span class="token number">1337</span><span class="token punctuation">;</span> <span class="token keyword">var</span> server <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'http'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">createServer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">listen</span><span class="token punctuation">(</span> port <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> io <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'socket.io'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">listen</span><span class="token punctuation">(</span> server <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> user <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'./functions/server/js/user'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Beispiel für ein eigens externes Modul.</span> io<span class="token punctuation">.</span>sockets<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'connection'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">socket</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> socket<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'getConnection'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">req</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> user<span class="token punctuation">.</span><span class="token function">getConnection</span><span class="token punctuation">(</span> socket<span class="token punctuation">,</span> req<span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter">res</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> socket<span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'setConnection'</span><span class="token punctuation">,</span> res<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//.</span> <span class="token comment">//.</span> <span class="token comment">//.</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Wenn ich das Beispiel folgenderweise bei mir umsetze, bekomme ich zum Beispiel, gar keine Verbindung mehr zum Server und erhalte im Browser nur ein "400 (Bad Reaquest)" beim Verbindundungsversuch zurück.</p> <pre><code class="block language-javascript"><span class="token keyword">var</span> cluster <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'cluster'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> port <span class="token operator">=</span> process<span class="token punctuation">.</span>env<span class="token punctuation">.</span><span class="token constant">PORT</span> <span class="token operator">||</span> <span class="token number">1337</span><span class="token punctuation">;</span> <span class="token keyword">var</span> threads <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'os'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">cpus</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>length<span class="token punctuation">;</span> <span class="token keyword">var</span> user <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'./functions/server/js/user'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span> cluster<span class="token punctuation">.</span>isMaster <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> threads<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cluster<span class="token punctuation">.</span><span class="token function">fork</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> cluster<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'online'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">thread</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> cluster<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'exit'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">thread<span class="token punctuation">,</span> code<span class="token punctuation">,</span> signal</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cluster<span class="token punctuation">.</span><span class="token function">fork</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> server <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'http'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">createServer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">listen</span><span class="token punctuation">(</span> port <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> io <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'socket.io'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">listen</span><span class="token punctuation">(</span> server <span class="token punctuation">)</span><span class="token punctuation">;</span> io<span class="token punctuation">.</span>sockets<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'connection'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">socket</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> socket<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'getConnection'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">req</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> user<span class="token punctuation">.</span><span class="token function">getConnection</span><span class="token punctuation">(</span> socket<span class="token punctuation">,</span> req<span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter">res</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> socket<span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'setConnection'</span><span class="token punctuation">,</span> res<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//.</span> <span class="token comment">//.</span> <span class="token comment">//.</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Weiterhin werden alle externen Module für jeden thread neu geladen. Sprich in dem Beispiel wird <code>var user = require('./functions/server/js/user');</code> bei mir 4 mal aufgerufen. Da ich vermute, dass die ganzen Daten im RAM gespeichert werden, würde ich gern die Beanspruchung so gering wie Möglich halten. Daher: Kann man das irgendwie verhindern, beziehungsweise <code>user</code> so Global setzen, dass jeder thread darauf zugreifen kann?</p> <p>Schonmal vielen Dank für eure Hilfe.</p> <p>Gruß<br> Jo</p> Node.js + socket.io, Cluster / Multithreading Sun, 28 Jan 18 12:19:14 Z https://forum.selfhtml.org/self/2018/jan/28/node-punkt-js-plus-socket-punkt-io-cluster-strich-multithreading/1712868#m1712868 https://forum.selfhtml.org/self/2018/jan/28/node-punkt-js-plus-socket-punkt-io-cluster-strich-multithreading/1712868#m1712868 <p>Tipp ins Blaue: Deine Umgebungsvariablen werden nicht an die Kind-Prozesse weitergegeben, deswegen lauschen die Http-Server auf den Port <code>1337</code> und nicht auf <code>process.env.PORT</code>. Lösen könntest du das, indem du beim Forken die Umgebungsvariablen manuell durchreichst: <code>cluster.fork(process.env)</code>.</p> <blockquote> <p>Kann man das irgendwie verhindern, beziehungsweise user so Global setzen, dass jeder thread darauf zugreifen kann?</p> </blockquote> <p>Jein, Threads haben in der Regel einen gemeinsamen Speicherbereich, aber <code>cluster.fork</code> erzeugt ganz neue Prozesse, die haben völlig getrennte Speicherbereiche. Du könntest aber die Arbeit die im User-Modul stattfindet nur im Master-Prozess erledigen lassen, und die Worker über die Ergebnisse per <code>worker.send</code> informieren. Das ist aber ganz schönes Gefrickel und du verlierst einige Vorteile der Parallelisierung, weil die Synchronisations-Punkte zwischen deinen Prozessen einbaust.</p> Node.js + socket.io, Cluster / Multithreading Tue, 30 Jan 18 10:32:26 Z https://forum.selfhtml.org/self/2018/jan/28/node-punkt-js-plus-socket-punkt-io-cluster-strich-multithreading/1712928#m1712928 https://forum.selfhtml.org/self/2018/jan/28/node-punkt-js-plus-socket-punkt-io-cluster-strich-multithreading/1712928#m1712928 <p>Guten Morgen zusammen,</p> <p>Folgendes hab ich jetzt mithilfe von diversen Modulen zusammen gestellt, was denke ich funktioniert.</p> <p>Verwendet, bzw gerade installiert:<br> <a href="https://github.com/indutny/sticky-session" rel="noopener noreferrer">sticky-session</a><br> <a href="https://github.com/elad/node-cluster-socket.io" rel="noopener noreferrer">socket.io-redis</a> brauch ich das??</p> <blockquote> <pre><code class="block language-javascript"><span class="token comment">//var cluster = require('cluster');</span> <span class="token keyword">var</span> http <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'http'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> threads <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'os'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">cpus</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>length<span class="token punctuation">;</span> <span class="token comment">//var redis = require('socket.io-redis');</span> <span class="token keyword">var</span> sticky <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'sticky-session'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> port <span class="token operator">=</span> <span class="token number">1337</span><span class="token punctuation">;</span> <span class="token keyword">var</span> server <span class="token operator">=</span> http<span class="token punctuation">.</span><span class="token function">createServer</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">var</span> io <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'socket.io'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">listen</span><span class="token punctuation">(</span> server <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> user <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'./functions/server/js/user'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token operator">!</span>sticky<span class="token punctuation">.</span><span class="token function">listen</span><span class="token punctuation">(</span> server<span class="token punctuation">,</span> port <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> <span class="token string">'[ Node ] Server running on Port : '</span> <span class="token operator">+</span> port <span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> <span class="token string">'[ Node ] Master cluster setting up '</span> <span class="token operator">+</span> threads <span class="token operator">+</span> <span class="token string">' threads'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> cluster<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'online'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">thread</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> <span class="token string">'[ Node ] Cluster thread '</span> <span class="token operator">+</span> cluster<span class="token punctuation">.</span>worker<span class="token punctuation">.</span>id <span class="token operator">+</span> <span class="token string">' set up'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> cluster<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span> <span class="token string">'exit'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">thread<span class="token punctuation">,</span> code<span class="token punctuation">,</span> signal</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> <span class="token string">'[ Node ] Cluster thread '</span> <span class="token operator">+</span> thread<span class="token punctuation">.</span>id <span class="token operator">+</span> <span class="token string">' died with code: '</span> <span class="token operator">+</span> code <span class="token operator">+</span> <span class="token string">', >and signal: '</span> <span class="token operator">+</span> signal <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> io<span class="token punctuation">.</span>sockets<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'connection'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">socket</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> socket<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'getConnection'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">req</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> user<span class="token punctuation">.</span><span class="token function">getConnection</span><span class="token punctuation">(</span> socket<span class="token punctuation">,</span> req<span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter">res</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> socket<span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'setConnection'</span><span class="token punctuation">,</span> res<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//.</span> <span class="token comment">//.</span> <span class="token comment">//.</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Ist das richtig?</p> <p>Also ich bekomme eine Verbindung und es werden 4 Prozesse initialisiert.<br> Einige kleine Tests ergeben auch das unterschiedliche Clients auf den unterschiedlichen 'workern' landen und das ein 'worker' bei einem unerwartetem 'exit' neu gestartet wird.</p> <p>Wie das so ist, folgt nach einem Problem gleich das nächste. Dafür habe ich eigentlich eine Lösung, persönlich gefällt mir die aber nicht.<br> Ich habe ein Globales Object mit <code>var global = require('./functions/server/js/global');</code> eingebunden, welches ein Abbild von (größtenteils) statischen Werten aus meiner Datenbank ist. Diese Werte nutze ich zum Beispiel in Berechnungen. Außerdem nutzen diverse Cron-jobs diese Daten um einige Werte Zeitabhängig neu zu berechnen. Diese Lösung finde ich sehr praktisch, da die Cron-jobs sowie durch einen Client getriggerte Berechnungen nicht erst die Datenbank abfragen müssen sondern direkt die Werte aus global.xyz nehmen können und die Ergebnisse in der Datenbank einfach aktualisiert werden können.<br> Damit nutze ich die Datenbank im Moment noch Primär als Backup, falls der Node Prozess ausfällt (und in global.js werden die Daten bei jedem Neustart des Prozesses aus der Datenbank geladen).</p> <p>Lösung, alle (benötigten) Daten bei jedem Event (Client oder Cron getriggert) neu aus der Datenbank holen und dann aktualisieren. Wie gesagt, erscheint mir das nicht elegant, bietet aber den Vorteil, dass jeder 'worker' die gleichen Daten aus der Datenbank hat.</p> <p>Was mich da etwas verunsichert ist, dass ich nicht weiß ob jeder 'worker' eine Referenz auf das Objekt bekommt wenn ich es zuerst im Master einbinde und dann in den einzelnen 'workern'.</p> <p>Gruß<br> Jo</p> Node.js + socket.io, Cluster / Multithreading Sun, 28 Jan 18 12:32:01 Z https://forum.selfhtml.org/self/2018/jan/28/node-punkt-js-plus-socket-punkt-io-cluster-strich-multithreading/1712870#m1712870 https://forum.selfhtml.org/self/2018/jan/28/node-punkt-js-plus-socket-punkt-io-cluster-strich-multithreading/1712870#m1712870 <p>Tach!</p> <blockquote> <p>Tipp ins Blaue: Deine Umgebungsvariablen werden nicht an die Kind-Prozesse weitergegeben, deswegen lauschen die Http-Server auf den Port <code>1337</code> und nicht auf <code>process.env.PORT</code>.</p> </blockquote> <p>Das könnte man mit netstat überprüfen. Je nach Betriebssystem braucht man da den passenden Parameter, um sich lauschende Ports anzeigen zu lassen.</p> <p>dedlfix.</p> Node.js + socket.io, Cluster / Multithreading Sun, 28 Jan 18 13:02:04 Z https://forum.selfhtml.org/self/2018/jan/28/node-punkt-js-plus-socket-punkt-io-cluster-strich-multithreading/1712871#m1712871 https://forum.selfhtml.org/self/2018/jan/28/node-punkt-js-plus-socket-punkt-io-cluster-strich-multithreading/1712871#m1712871 <p>Moin,</p> <blockquote> <p>Tipp ins Blaue: Deine Umgebungsvariablen werden nicht an die Kind-Prozesse weitergegeben, deswegen lauschen die Http-Server auf den Port <code>1337</code> und nicht auf <code>process.env.PORT</code>. Lösen könntest du das, indem du beim Forken die Umgebungsvariablen manuell durchreichst: <code>cluster.fork(process.env)</code>.</p> </blockquote> <p>Hm... Ne funktioniert leider nicht, <code>var port</code> ist aber auch 1337 und nicht process.env.port, Müsste ich eh rausnehmen, da der Client sich zu Port 1337 verbinden möchte. Wie dem auch sei, habe ich mir gerade mal für beide Fälle das Server-Object per Console ausgeben lassen. Mit einem interessantem Unterschied:</p> <pre><code class="block language-javascript">Server <span class="token punctuation">{</span> <span class="token literal-property property">domain</span><span class="token operator">:</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token literal-property property">_events</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token literal-property property">connection</span><span class="token operator">:</span> <span class="token punctuation">[</span>Function<span class="token operator">:</span> connectionListener<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token literal-property property">listening</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">[</span>Function<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>Function<span class="token operator">:</span> bound <span class="token punctuation">]</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token literal-property property">close</span><span class="token operator">:</span> <span class="token punctuation">[</span>Function<span class="token operator">:</span> bound <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token literal-property property">upgrade</span><span class="token operator">:</span> <span class="token punctuation">[</span>Function<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token literal-property property">request</span><span class="token operator">:</span> <span class="token punctuation">[</span>Function<span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token literal-property property">_eventsCount</span><span class="token operator">:</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token literal-property property">_maxListeners</span><span class="token operator">:</span> <span class="token keyword">undefined</span><span class="token punctuation">,</span> <span class="token literal-property property">_connections</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token literal-property property">_handle</span><span class="token operator">:</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token literal-property property">_usingWorkers</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token literal-property property">_workers</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token literal-property property">_unref</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token literal-property property">allowHalfOpen</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token literal-property property">pauseOnConnect</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token literal-property property">httpAllowHalfOpen</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token literal-property property">timeout</span><span class="token operator">:</span> <span class="token number">120000</span><span class="token punctuation">,</span> <span class="token literal-property property">keepAliveTimeout</span><span class="token operator">:</span> <span class="token number">5000</span><span class="token punctuation">,</span> <span class="token literal-property property">_pendingResponseData</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token literal-property property">maxHeadersCount</span><span class="token operator">:</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token function">Symbol</span><span class="token punctuation">(</span>asyncId<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token operator">:</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token punctuation">}</span> </code></pre> <p>Das kommt bei der Cluster Methode.</p> <p>Und bei der alten Methode zusätzlich diese Zeile: <code>_connectionKey: '6::::1337', </code> und danach <code>[Symbol(asyncId)]: 6 }</code></p> <p>Interessant aber viel kann ich mit der Information gerade nicht anfangen.</p> <blockquote> <p>Jein, Threads haben in der Regel einen gemeinsamen Speicherbereich, aber <code>cluster.fork</code> erzeugt ganz neue Prozesse, die haben völlig getrennte Speicherbereiche. Du könntest aber die Arbeit die im User-Modul stattfindet nur im Master-Prozess erledigen lassen, und die Worker über die Ergebnisse per <code>worker.send</code> informieren. Das ist aber ganz schönes Gefrickel und du verlierst einige Vorteile der Parallelisierung, weil die Synchronisations-Punkte zwischen deinen Prozessen einbaust.</p> </blockquote> <p>Ja, das habe ich mich auch schon fast gedacht. Das wäre denke ich zu kompliziert nachträglich noch zu realisieren.</p> <p>Hm, ganz unterschiedliche Prozesse ist Schlecht... Obwohl kann mir egal sein, solange die wichtigen Daten richtig geschickt werden. Das sollte ich leicht hinkriegen.</p> <p>Gruß<br> Jo</p> Node.js + socket.io, Cluster / Multithreading Sun, 28 Jan 18 13:06:59 Z https://forum.selfhtml.org/self/2018/jan/28/node-punkt-js-plus-socket-punkt-io-cluster-strich-multithreading/1712872#m1712872 https://forum.selfhtml.org/self/2018/jan/28/node-punkt-js-plus-socket-punkt-io-cluster-strich-multithreading/1712872#m1712872 <p>Moin,</p> <blockquote> <p>Das könnte man mit netstat überprüfen. Je nach Betriebssystem braucht man da den passenden Parameter, um sich lauschende Ports anzeigen zu lassen.</p> </blockquote> <p><code>netstat -l</code> zeigt, dass Node auf 1337 lauscht.</p> <p>Gruß<br> Jo</p> Node.js + socket.io, Cluster / Multithreading Tue, 30 Jan 18 14:17:46 Z https://forum.selfhtml.org/self/2018/jan/28/node-punkt-js-plus-socket-punkt-io-cluster-strich-multithreading/1712945#m1712945 https://forum.selfhtml.org/self/2018/jan/28/node-punkt-js-plus-socket-punkt-io-cluster-strich-multithreading/1712945#m1712945 <p>Hey,</p> <p>Ich habe ein Modul gefunden mit dem sich eine globale <a href="https://github.com/fent/clusterhub" rel="noopener noreferrer">Schnittstelle</a> von Daten bewerkstelligen lassen würde. Nur habe ich die Befürchtung, dass wenn 2 Prozesse gleiche Daten bearbeiten oder abfragen, dass dies zu Fehlern führen könnte.<br> Beliebtes Beispiel ist hier ja immer etwas wie, 2 Personen bestellen den letzten Apfel im Sortiment und beide bezahlen diesen nur derjenige, dessen Prozess 1 Millisekunde später fertig ist, bekommt keinen Apfel, da dieser dann schon nicht mehr im Sortiment ist.</p> <p>Um so etwas zu verhindern, wäre die Datenbank variante besser, obwohl ich da nicht weiß ob ich in dem mysql-pool ein Transaction eingebaut bekomme, welches ja genau das verhindern soll.</p> <p>Gruß<br> Jo</p>