ÕªÒª: ´«Í³ÒâÒåÉ쵀 JavaScript ÔËÐÐÔÚä¯ÀÀÆ÷ÉÏ£¬ÕâÊÇÒòΪä¯ÀÀÆ÷ÄÚºËʵ¼ÊÉÏ·ÖΪÁ½¸ö²¿·Ö£ºäÖȾÒýÇæºÍ
JavaScript ÒýÇæ¡£Ç°Õ߸ºÔðäÖȾ HTML + CSS£¬ºóÕßÔò¸ºÔðÔËÐÐ JavaScript¡£Chrome
ʹÓÃµÄ JavaScript ÒýÇæÊÇ V8£¬ËüµÄËÙ ... Node.js ÊÇʲô
´«Í³ÒâÒåÉ쵀 JavaScript ÔËÐÐÔÚä¯ÀÀÆ÷ÉÏ£¬ÕâÊÇÒòΪä¯ÀÀÆ÷ÄÚºËʵ¼ÊÉÏ·ÖΪÁ½¸ö²¿·Ö£ºäÖȾÒýÇæºÍ
JavaScript ÒýÇæ¡£Ç°Õ߸ºÔðäÖȾ HTML + CSS£¬ºóÕßÔò¸ºÔðÔËÐÐ JavaScript¡£Chrome
ʹÓÃµÄ JavaScript ÒýÇæÊÇ V8£¬ËüµÄËٶȷdz£¿ì¡£
Node.js ÊÇÒ»¸öÔËÐÐÔÚ·þÎñ¶ËµÄ¿ò¼Ü£¬ËüµÄµ×²ã¾ÍʹÓÃÁË V8 ÒýÇæ¡£ÎÒÃÇÖªµÀ Apache +
PHP ÒÔ¼° Java µÄ Servlet ¶¼¿ÉÒÔÓÃÀ´¿ª·¢¶¯Ì¬ÍøÒ³£¬Node.js µÄ×÷ÓÃÓëËûÃÇÀàËÆ£¬Ö»²»¹ýÊÇʹÓÃ
JavaScript À´¿ª·¢¡£ ´Ó¶¨ÒåÉϽéÉÜÍêºó£¬¾ÙÒ»¸ö¼òµ¥µÄÀý×Ó£¬Ð½¨Ò»¸ö app.js Îļþ²¢ÊäÈëÒÔÏÂÄÚÈÝ:
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'}); // HTTP Response Í·²¿
response.end('Hello World\n'); // ·µ»ØÊý¾Ý ¡°Hello World¡±
}).listen(8888); // ¼àÌý 8888 ¶Ë¿Ú
// ÖÕ¶Ë´òÓ¡ÈçÏÂÐÅÏ¢
console.log('Server running at http://127.0.0.1:8888/');
|
ÕâÑù£¬Ò»¸ö¼òµ¥µÄ HTTP Server ¾ÍËãÊÇдÍêÁË£¬ÊäÈë node app.js ¼´¿ÉÔËÐУ¬Ëæºó·ÃÎÊ
±ã»á¿´µ½Êä³ö½á¹û¡£
ΪʲôҪÓà Node.js
Ãæ¶ÔÒ»¸öм¼Êõ£¬¶àÎʼ¸¸öΪʲô×ÜÊǺõġ£¼ÈÈ» PHP¡¢Python¡¢Java
¶¼¿ÉÒÔÓÃÀ´½øÐкó¶Ë¿ª·¢£¬ÎªÊ²Ã´»¹ÒªÈ¥Ñ§Ï° Node.js?ÖÁÉÙÎÒÃÇÓ¦¸ÃÖªµÀÔÚʲô³¡¾°Ï£¬Ñ¡Ôñ Node.js
¸üºÏÊÊ¡£
×ܵÄÀ´Ëµ£¬Node.js ÊʺÏÒÔϳ¡¾°:
ʵʱÐÔÓ¦Ó㬱ÈÈçÔÚÏß¶àÈËÐ×÷¹¤¾ß£¬ÍøÒ³ÁÄÌìÓ¦Óõȡ£
ÒÔ I/O ΪÖ÷µÄ¸ß²¢·¢Ó¦Ó㬱ÈÈçΪ¿Í»§¶ËÌṩ API£¬¶ÁÈ¡Êý¾Ý¿â¡£
Á÷ʽӦÓ㬱ÈÈç¿Í»§¶Ë¾³£ÉÏ´«Îļþ¡£
ǰºó¶Ë·ÖÀë¡£
ʵ¼ÊÉÏǰÁ½Õß¿ÉÒÔ¹é½áΪһÖÖ£¬¼´¿Í»§¶Ë¹ã·ºÊ¹Óó¤Á¬½Ó£¬ËäÈ»²¢·¢Êý½Ï¸ß£¬µ«ÆäÖд󲿷ÖÊÇ¿ÕÏÐÁ¬½Ó¡£
Node.js Ò²ÓÐËüµÄ¾ÖÏÞÐÔ£¬Ëü²¢²»ÊÊºÏ CPU Ãܼ¯Ð͵ÄÈÎÎñ£¬±ÈÈçÈ˹¤ÖÇÄÜ·½ÃæµÄ¼ÆË㣬ÊÓÆµ¡¢Í¼Æ¬µÄ´¦ÀíµÈ¡£
µ±È»£¬ÒÔÉÏȱµã²»ÊÇÐſڿªºÓ£¬»òÕßËÀ¼ÇÓ²±³£¬¸ü²»ÊÇÈËÔÆÒàÔÆ£¬ÐèÒªÎÒÃǶÔ
Node.js µÄÔÀíÓÐÒ»¶¨µÄÁ˽⣬²ÅÄÜ×ö³öÕýÈ·µÄÅжϡ£
»ù´¡¸ÅÄî
ÔÚ½éÉÜ Node.js ֮ǰ£¬ÀíÇå³þһЩ»ù±¾¸ÅÄîÓÐÖúÓÚ¸üÉîÈëµÄÀí½â Node.js
¡£
²¢·¢
Óë¿Í»§¶Ë²»Í¬£¬·þÎñ¶Ë¿ª·¢Õ߷dz£¹ØÐĵÄÒ»ÏîÊý¾ÝÊDz¢·¢Êý£¬Ò²¾ÍÊÇÕą̂·þÎñÆ÷×î¶àÄÜÖ§³Ö¶àÉÙ¸ö¿Í»§¶ËµÄ²¢·¢ÇëÇó¡£ÔçÄêµÄ
C10K ÎÊÌâ¾ÍÊÇÌÖÂÛÈçºÎÀûÓõ¥Ì¨·þÎñÆ÷Ö§³Ö 10K ²¢·¢Êý¡£µ±È»Ëæ×ÅÈíÓ²¼þÐÔÄܵÄÌá¸ß£¬Ä¿Ç° C10K
ÒѾ²»ÔÙÊÇÎÊÌ⣬ÎÒÃÇ¿ªÊ¼³¢ÊÔ½â¾ö C10M ÎÊÌ⣬¼´µ¥Ì¨·þÎñÆ÷ÈçºÎ´¦Àí°ÙÍò¼¶µÄ²¢·¢¡£
ÔÚ C10K Ìá³öʱ£¬ÎÒÃÇ»¹ÔÚʹÓà Apache ·þÎñÆ÷£¬ËüµÄ¹¤×÷ÔÀíÊÇÿµ±ÓÐÒ»¸öÍøÂçÇëÇ󵽴¾Í
fork ³öÒ»¸ö×Ó½ø³Ì²¢ÔÚ×Ó½ø³ÌÖÐÔËÐÐ PHP ½Å±¾¡£Ö´ÐÐÍê½Å±¾ºóÔٰѽá¹û·¢»Ø¿Í»§¶Ë¡£
ÕâÑù¿ÉÒÔÈ·±£²»Í¬½ø³ÌÖ®¼ä»¥²»¸ÉÈÅ£¬¼´Ê¹Ò»¸ö½ø³Ì³öÎÊÌâÒ²²»Ó°ÏìÕû¸ö·þÎñÆ÷£¬µ«ÊÇȱµãÒ²ºÜÃ÷ÏÔ:½ø³ÌÊÇÒ»¸ö±È½ÏÖØµÄ¸ÅÄӵÓÐ×Ô¼ºµÄ¶ÑºÍÕ»£¬Õ¼ÓÃÄÚ´æ½Ï¶à£¬Ò»Ì¨·þÎñÆ÷ÄÜÔËÐеĽø³ÌÊýÁ¿ÓÐÉÏÏÞ£¬´óÔ¼Ò²¾ÍÔÚ¼¸Ç§×óÓÒ¡£
ËäÈ» Apache ºóÀ´Ê¹ÓÃÁË FastCGI£¬µ«±¾ÖÊÉÏÖ»ÊÇÒ»¸ö½ø³Ì³Ø£¬Ëü¼õÉÙÁË´´½¨½ø³ÌµÄ¿ªÏú£¬µ«ÎÞ·¨ÓÐЧÌá¸ß²¢·¢Êý¡£
Java µÄ Servlet ʹÓÃÁËÏ̳߳أ¬¼´Ã¿¸ö Servlet ÔËÐÐÔÚÒ»¸öÏß³ÌÉÏ¡£Ïß³ÌËäÈ»±È½ø³ÌÇáÁ¿£¬µ«Ò²ÊÇÏà¶ÔµÄ¡£ÓÐÈ˲âÊÔ¹ý£¬Ã¿¸öÏ̶߳ÀÏíµÄÕ»µÄ´óСÊÇ
1M£¬ÒÀÈ»²»¹»¸ßЧ¡£³ý´ËÒÔÍ⣬¶àÏ̱߳à³Ì»á´øÀ´¸÷ÖÖÂé·³£¬ÕâÒ»µãÏë±Ø³ÌÐòÔ±ÃǶ¼ÉîÓÐÌå»á¡£
Èç¹û²»Ê¹ÓÃỊ̈߳¬»¹ÓÐÁ½ÖÖ½â¾ö·½°¸£¬·Ö±ðÊÇʹÓÃгÌ(coroutine)ºÍ·Ç×èÈû
I/O¡£Ð³Ì±ÈÏ̸߳ü¼ÓÇáÁ¿£¬¶à¸öг̿ÉÒÔÔËÐÐÔÚͬһ¸öÏß³ÌÖУ¬²¢ÓɳÌÐòÔ±×Ô¼º¸ºÔðµ÷¶È£¬ÕâÖÖ¼¼ÊõÔÚ Go ÓïÑÔÖб»¹ã·ºÊ¹Ó᣶ø·Ç×èÈû
I/O Ôò±» Node.js ÓÃÀ´´¦Àí¸ß²¢·¢µÄ³¡¾°¡£
·Ç×èÈû I/O
ÕâÀïËù˵µÄ I/O ¿ÉÒÔ·ÖΪÁ½ÖÖ: ÍøÂç I/O ºÍÎļþ I/O£¬Êµ¼ÊÉÏÁ½Õ߸߶ÈÀàËÆ¡£
I/O ¿ÉÒÔ·ÖΪÁ½¸ö²½Ö裬Ê×ÏȰÑÎļþ(ÍøÂç)ÖеÄÄÚÈÝ¿½±´µ½»º³åÇø£¬Õâ¸ö»º³åÇøÎ»ÓÚ²Ù×÷ϵͳ¶ÀÕ¼µÄÄÚ´æÇøÓòÖС£ËæºóÔÙ°Ñ»º³åÇøÖеÄÄÚÈÝ¿½±´µ½Óû§³ÌÐòµÄÄÚ´æÇøÓòÖС£
¶ÔÓÚ×èÈû I/O À´Ëµ£¬´Ó·¢Æð¶ÁÇëÇ󣬵½»º³åÇø¾ÍÐ÷£¬ÔÙµ½Óû§½ø³Ì»ñÈ¡Êý¾Ý£¬ÕâÁ½¸ö²½Öè¶¼ÊÇ×èÈûµÄ¡£
·Ç×èÈû I/O ʵ¼ÊÉÏÊÇÏòÄÚºËÂÖѯ£¬»º³åÇøÊÇ·ñ¾ÍÐ÷£¬Èç¹ûûÓÐÔò¼ÌÐøÖ´ÐÐÆäËû²Ù×÷¡£µ±»º³åÇø¾ÍÐ÷ʱ£¬½²»º³åÇøÄÚÈÝ¿½±´µ½Óû§½ø³Ì£¬ÕâÒ»²½Êµ¼ÊÉÏ»¹ÊÇ×èÈûµÄ¡£
I/O ¶à·¸´Óü¼ÊõÊÇÖ¸ÀûÓõ¥¸öÏ̴߳¦Àí¶à¸öÍøÂç I/O£¬ÎÒÃdz£ËµµÄ
select¡¢epoll ¾ÍÊÇÓÃÀ´ÂÖѯËùÓÐ socket µÄº¯Êý¡£±ÈÈç Apache ²ÉÓÃÁËǰÕߣ¬¶ø Nginx
ºÍ Node.js ʹÓÃÁ˺óÕߣ¬Çø±ðÔÚÓÚºóÕßЧÂʸü¸ß¡£ÓÉÓÚ I/O ¶à·¸´ÓÃʵ¼ÊÉÏ»¹Êǵ¥Ï̵߳ÄÂÖѯ£¬Òò´ËËüÒ²ÊÇÒ»ÖÖ·Ç×èÈû
I/O µÄ·½°¸¡£
Òì²½ I/O ÊÇ×îÀíÏëµÄ I/O Ä£ÐÍ£¬È»¶ø¿ÉϧµÄÊÇÕæÕýµÄÒì²½ I/O
²¢²»´æÔÚ¡£ Linux É쵀 AIO ͨ¹ýÐźźͻص÷À´´«µÝÊý¾Ý£¬µ«ÊÇ´æÔÚȱÏÝ¡£ÏÖÓÐµÄ libeio ÒÔ¼°
Windows É쵀 IOCP£¬±¾ÖÊÉ϶¼ÊÇÀûÓÃÏ̳߳ØÓë×èÈû I/O À´Ä£ÄâÒì²½ I/O¡£
Node.js Ïß³ÌÄ£ÐÍ
ºÜ¶àÎÄÕ¶¼Ìáµ½ Node.js Êǵ¥Ï̵߳ģ¬È»¶øÕâÑùµÄ˵·¨²¢²»ÑϽ÷£¬ÉõÖÁ¿ÉÒÔ˵ºÜ²»¸ºÔð£¬ÒòΪÎÒÃÇÖÁÉÙ»áÏëµ½ÒÔϼ¸¸öÎÊÌâ:
Node.js ÔÚÒ»¸öÏß³ÌÖÐÈçºÎ´¦Àí²¢·¢ÇëÇó?
Node.js ÔÚÒ»¸öÏß³ÌÖÐÈçºÎ½øÐÐÎļþµÄÒì²½ I/O?
Node.js ÈçºÎÖØ¸´ÀûÓ÷þÎñÆ÷ÉϵĶà¸ö CPU µÄ´¦ÀíÄÜÁ¦?
ÍøÂç I/O
Node.js ȷʵ¿ÉÒÔÔÚµ¥Ïß³ÌÖд¦Àí´óÁ¿µÄ²¢·¢ÇëÇ󣬵«ÕâÐèÒªÒ»¶¨µÄ±à³Ì¼¼ÇÉ¡£ÎÒÃǻعËÒ»ÏÂÎÄÕ¿ªÍ·µÄ´úÂ룬ִÐÐÁË
app.js Îļþºó¿ØÖÆÌ¨Á¢¿Ì¾Í»áÓÐÊä³ö£¬¶øÔÚÎÒÃÇ·ÃÎÊÍøÒ³Ê±²Å»á¿´µ½ ¡°Hello£¬World¡±¡£
ÕâÊÇÒòΪ Node.js ÊÇʼþÇý¶¯µÄ£¬Ò²¾ÍÊÇ˵ֻÓÐÍøÂçÇëÇóÕâһʼþ·¢Éúʱ£¬ËüµÄ»Øµ÷º¯Êý²Å»áÖ´ÐС£µ±Óжà¸öÇëÇóµ½À´Ê±£¬ËûÃÇ»áÅųÉÒ»¸ö¶ÓÁУ¬ÒÀ´ÎµÈ´ýÖ´ÐС£
Õâ¿´ÉÏÈ¥ÀíËùµ±È»£¬È»¶øÈç¹ûûÓÐÉî¿ÌÈÏʶµ½ Node.js ÔËÐÐÔÚµ¥Ïß³ÌÉÏ£¬¶øÇһص÷º¯ÊýÊÇͬ²½Ö´ÐУ¬Í¬Ê±»¹°´ÕÕ´«Í³µÄģʽÀ´¿ª·¢³ÌÐò£¬¾Í»áµ¼ÖÂÑÏÖØµÄÎÊÌâ¡£¾Ù¸ö¼òµ¥µÄÀý×Ó£¬ÕâÀïµÄ
¡°Hello World¡± ×Ö·û´®¿ÉÄÜÊÇÆäËûij¸öÄ£¿éµÄÔËÐнá¹û¡£¼ÙÉè ¡°Hello World¡± µÄÉú³É·Ç³£ºÄʱ£¬¾Í»á×èÈûµ±Ç°ÍøÂçÇëÇóµÄ»Øµ÷£¬µ¼ÖÂÏÂÒ»´ÎÍøÂçÇëÇóÒ²ÎÞ·¨±»ÏìÓ¦¡£
½â¾ö·½·¨ºÜ¼òµ¥£¬²ÉÓÃÒì²½»Øµ÷»úÖÆ¼´¿É¡£ÎÒÃÇ¿ÉÒÔ°ÑÓÃÀ´²úÉúÊä³ö½á¹ûµÄ response
²ÎÊý´«µÝ¸øÆäËûÄ£¿é£¬²¢ÓÃÒì²½µÄ·½Ê½Éú³ÉÊä³ö½á¹û£¬×îºóÔڻص÷º¯ÊýÖÐÖ´ÐÐÕæÕýµÄÊä³ö¡£ÕâÑùµÄºÃ´¦ÊÇ£¬http.createServer
µÄ»Øµ÷º¯Êý²»»á×èÈû£¬Òò´Ë²»»á³öÏÖÇëÇóÎÞÏìÓ¦µÄÇé¿ö¡£
¾Ù¸öÀý×Ó£¬ÎÒÃǸÄÔìһϠserver µÄÈë¿Ú£¬Êµ¼ÊÉÏÈç¹ûÒª×Ô¼ºÍê³É·ÓÉ£¬´óÔ¼Ò²ÊÇÕâ¸ö˼·:
var http = require('http'); var output = require('./string') // Ò»¸öµÚÈý·½Ä£¿é http.createServer(function (request, response) { output.output(response); // µ÷ÓõÚÈý·½Ä£¿é½øÐÐÊä³ö }).listen(8888); |
µÚÈý·½Ä£¿é:
function sleep(milliSeconds) { // Ä£Ä⿨¶Ù var startTime = new Date().getTime(); while (new Date().getTime() < startTime + milliSeconds); } function outputString(response) { sleep(10000); // ×èÈû 10s response.end('Hello World\n'); // ÏÈÖ´ÐкÄʱ²Ù×÷£¬ÔÙÊä³ö } exports.output = outputString; |
×ÜÖ®£¬ÔÚÀûÓà Node.js ±à³Ìʱ£¬ÈκκÄʱ²Ù×÷Ò»¶¨ÒªÊ¹ÓÃÒì²½À´Íê³É£¬±ÜÃâ×èÈûµ±Ç°º¯Êý¡£ÒòΪÄãÔÚΪ¿Í»§¶ËÌṩ·þÎñ£¬¶øËùÓдúÂë×ÜÊǵ¥Ï̡߳¢Ë³ÐòÖ´ÐС£
Èç¹û³õѧÕß¿´µ½ÕâÀﻹÊÇÎÞ·¨Àí½â£¬½¨ÒéÔĶÁ ¡°Nodejs ÈëÃÅ¡± Õâ±¾Ê飬»òÕßÔĶÁÏÂÎĹØÓÚʼþÑ»·µÄÕ½ڡ£
Îļþ I/O
ÎÒÔÚ֮ǰµÄÎÄÕÂÖÐҲǿµ÷¹ý£¬Òì²½ÊÇΪÁËÓÅ»¯ÌåÑ飬±ÜÃ⿨¶Ù¡£¶øÕæÕý½ÚÊ¡´¦Àíʱ¼ä£¬ÀûÓÃ
CPU ¶àºËÐÔÄÜ£¬»¹ÊÇÒª¿¿¶àÏ̲߳¢Ðд¦Àí¡£
ʵ¼ÊÉÏ Node.js Ôڵײãά»¤ÁËÒ»¸öÏ̳߳ء£Ö®Ç°ÔÚ»ù´¡¸ÅÄ·ÖÒ²Ìáµ½¹ý£¬²»´æÔÚÕæÕýµÄÒì²½Îļþ
I/O£¬Í¨³£ÊÇͨ¹ýÏ̳߳ØÀ´Ä£Äâ¡£Ï̳߳ØÖÐĬÈÏÓÐËĸöỊ̈߳¬ÓÃÀ´½øÐÐÎļþ I/O¡£
ÐèҪעÒâµÄÊÇ£¬ÎÒÃÇÎÞ·¨Ö±½Ó²Ù×÷µ×²ãµÄÏ̳߳أ¬Êµ¼ÊÉÏÒ²²»ÐèÒª¹ØÐÄËüÃǵĴæÔÚ¡£Ï̳߳صÄ×÷Óýö½öÊÇÍê³É
I/O ²Ù×÷£¬¶ø·ÇÓÃÀ´Ö´ÐÐ CPU Ãܼ¯Ð͵IJÙ×÷£¬±ÈÈçͼÏñ¡¢ÊÓÆµ´¦Àí£¬´ó¹æÄ£¼ÆËãµÈ¡£
Èç¹ûÓÐÉÙÁ¿ CPU Ãܼ¯Ð͵ÄÈÎÎñÐèÒª´¦Àí£¬ÎÒÃÇ¿ÉÒÔÆô¶¯¶à¸ö Node.js
½ø³Ì²¢ÀûÓà IPC »úÖÆ½øÐнø³Ì¼äͨѶ£¬»òÕßµ÷ÓÃÍⲿµÄ C++/Java ³ÌÐò¡£Èç¹ûÓдóÁ¿ CPU Ãܼ¯ÐÍÈÎÎñ£¬ÄÇÖ»ÄÜ˵Ã÷Ñ¡Ôñ
Node.js ÊÇÒ»¸ö´íÎóµÄ¾ö¶¨¡£
Õ¥¸É CPU
µ½Ä¿Ç°ÎªÖ¹£¬ÎÒÃÇÖªµÀÁË Node.js ²ÉÓà I/O ¶à·¸´Óü¼Êõ£¬ÀûÓõ¥Ï̴߳¦ÀíÍøÂç
I/O£¬ÀûÓÃÏ̳߳غÍÉÙÁ¿Ïß³ÌÄ£ÄâÒì²½Îļþ I/O¡£ÄÇÔÚÒ»¸ö 32 ºË CPU ÉÏ£¬Node.js µÄµ¥Ïß³ÌÊÇ·ñÏԵü¦ÀßÄØ?
´ð°¸ÊÇ·ñ¶¨µÄ£¬ÎÒÃÇ¿ÉÒÔÆô¶¯¶à¸ö Node.js ½ø³Ì¡£²»Í¬ÓÚÉÏÒ»½ÚµÄÊÇ£¬½ø³ÌÖ®¼ä²»ÐèҪͨѶ£¬ËüÃǸ÷×Ô¼àÌýÒ»¸ö¶Ë¿Ú£¬Í¬Ê±ÔÚ×îÍâ²ãÀûÓÃ
Nginx ×ö¸ºÔؾùºâ¡£
Nginx ¸ºÔؾùºâ·Ç³£ÈÝÒ×ʵÏÖ£¬Ö»Òª±à¼ÅäÖÃÎļþ¼´¿É:
http{ upstream sampleapp { // ¿ÉÑ¡ÅäÖÃÏÈç least_conn£¬ip_hash server 127.0.0.1:3000; server 127.0.0.1:3001; // ... ¼àÌý¸ü¶à¶Ë¿Ú } .... server{ listen 80; ... location / { proxy_pass http://sampleapp; // ¼àÌý 80 ¶Ë¿Ú£¬È»ºóת·¢ } } |
ĬÈϵĸºÔؾùºâ¹æÔòÊǰÑÍøÂçÇëÇóÒÀ´Î·ÖÅäµ½²»Í¬µÄ¶Ë¿Ú£¬ÎÒÃÇ¿ÉÒÔÓà least_conn
±êÖ¾°ÑÍøÂçÇëÇóת·¢µ½Á¬½ÓÊý×îÉÙµÄ Node.js ½ø³Ì£¬Ò²¿ÉÒÔÓà ip_hash ±£Ö¤Í¬Ò»¸ö ip µÄÇëÇóÒ»¶¨ÓÉͬһ¸ö
Node.js ½ø³Ì´¦Àí¡£
¶à¸ö Node.js ½ø³Ì¿ÉÒÔ³ä·Ö·¢»Ó¶àºË CPU µÄ´¦ÀíÄÜÁ¦£¬Ò²¾ßÓкÜÇ¿´óµÄÍØÕ¹ÄÜÁ¦¡£
ʼþÑ»·
ÔÚ Node.js ÖдæÔÚÒ»¸öʼþÑ»·(Event Loop)£¬Óйý iOS
¿ª·¢¾ÑéµÄͬѧ¿ÉÄÜ»á¾õµÃÑÛÊ졣û´í£¬ËüºÍ Runloop ÔÚÒ»¶¨³Ì¶ÈÉÏÊÇÀàËÆµÄ¡£
Ò»´ÎÍêÕûµÄ Event Loop Ò²¿ÉÒÔ·ÖΪ¶à¸ö½×¶Î(phase)£¬ÒÀ´ÎÊÇ
poll¡¢check¡¢close callbacks¡¢timers¡¢I/O callbacks ¡¢Idle¡£
ÓÉÓÚ Node.js ÊÇʼþÇý¶¯µÄ£¬Ã¿¸öʼþµÄ»Øµ÷º¯Êý»á±»×¢²áµ½ Event
Loop µÄ²»Í¬½×¶Î¡£±ÈÈçfs.readFile µÄ»Øµ÷º¯Êý±»Ìí¼Óµ½ I/O callbacks£¬setImmediate
µÄ»Øµ÷±»Ìí¼Óµ½ÏÂÒ»´Î Loop µÄ poll ½×¶Î½áÊøºó£¬process.nextTick() µÄ»Øµ÷±»Ìí¼Óµ½µ±Ç°
phase ½áÊøºó£¬ÏÂÒ»¸ö phase ¿ªÊ¼Ç°¡£
²»Í¬Òì²½·½·¨µÄ»Øµ÷»áÔÚ²»Í¬µÄ phase ±»Ö´ÐУ¬ÕÆÎÕÕâÒ»µãºÜÖØÒª£¬·ñÔò¾Í»áÒòΪµ÷ÓÃ˳ÐòÎÊÌâ²úÉúÂß¼´íÎó¡£
Event Loop ²»¶ÏµÄÑ»·£¬Ã¿Ò»¸ö½×¶ÎÄÚ¶¼»áͬ²½Ö´ÐÐËùÓÐÔڸý׶Î×¢²áµÄ»Øµ÷º¯Êý¡£ÕâÒ²ÕýÊÇΪʲôÎÒÔÚÍøÂç
I/O ²¿·ÖÌáµ½£¬²»ÒªÔڻص÷º¯ÊýÖе÷ÓÃ×èÈû·½·¨£¬×ÜÊÇÓÃÒì²½µÄ˼ÏëÀ´½øÐкÄʱ²Ù×÷¡£Ò»¸öºÄʱ̫¾ÃµÄ»Øµ÷º¯Êý¿ÉÄÜ»áÈÃ
Event Loop ¿¨ÔÚij¸ö½×¶ÎºÜ¾Ã£¬ÐÂÀ´µÄÍøÂçÇëÇó¾ÍÎÞ·¨±»¼°Ê±ÏìÓ¦¡£
ÓÉÓÚ±¾ÎĵÄÄ¿µÄÊÇ¶Ô Node.js ÓÐÒ»¸ö³õ²½µÄ£¬È«ÃæµÄÈÏʶ¡£¾Í²»Ïêϸ½éÉÜ
Event Loop µÄÿ¸ö½×¶ÎÁË£¬¾ßÌåϸ½Ú¿ÉÒԲ鿴¹Ù·½Îĵµ¡£
¿ÉÒÔ¿´³ö Event Loop »¹ÊÇ±È½ÏÆ«µ×²ãµÄ£¬ÎªÁË·½±ãµÄʹÓÃʼþÇý¶¯µÄ˼Ï룬Node.js
·â×°ÁËEventEmitter Õâ¸öÀà:
var EventEmitter = require('events'); var util = require('util'); function MyThing() { EventEmitter.call(this); setImmediate(function (self) { self.emit('thing1'); }, this); process.nextTick(function (self) { self.emit('thing2'); }, this); } util.inherits(MyThing, EventEmitter); var mt = new MyThing(); mt.on('thing1', function onThing1() { console.log("Thing1 emitted"); }); mt.on('thing2', function onThing1() { console.log("Thing2 emitted"); }); |
¸ù¾ÝÊä³ö½á¹û¿ÉÖª£¬self.emit(thing2) ËäÈ»ºó¶¨Ò壬µ«Ïȱ»Ö´ÐУ¬ÕâÒ²ÍêÈ«·ûºÏ
Event Loop µÄµ÷ÓùæÔò¡£
Node.js ÖкܶàÄ£¿é¶¼¼Ì³Ð×Ô EventEmitter£¬±ÈÈçÏÂÒ»½ÚÖÐÌáµ½µÄ
fs.readStream£¬ËüÓÃÀ´´´½¨Ò»¸ö¿É¶ÁÎļþÁ÷£¬ ´ò¿ªÎļþ¡¢¶ÁÈ¡Êý¾Ý¡¢¶ÁÈ¡Íê³Éʱ¶¼»áÅ׳öÏàÓ¦µÄʼþ¡£
Êý¾ÝÁ÷
ʹÓÃÊý¾ÝÁ÷µÄºÃ´¦ºÜÃ÷ÏÔ£¬Éú»îÖÐÒ²ÓÐÕæÊµÐ´ÕÕ¡£¾Ù¸öÀý×Ó£¬ÀÏʦ²¼ÖÃÁËÊî¼Ù×÷Òµ£¬Èç¹ûѧÉúÿÌì¶¼×öÒ»µã(×÷ÒµÁ÷)£¬¾Í¿ÉÒԱȽÏÇáËɵÄÍê³ÉÈÎÎñ¡£Èç¹û»ýѹÔÚÒ»Æð£¬µ½ÁË×îºóÒ»Ìì£¬Ãæ¶Ô¶Ñ³ÉСɽµÄ×÷Òµ±¾£¬¾Í»á¸Ðµ½Á¦²»´ÓÐÄ¡£
Server ¿ª·¢Ò²ÊÇÕâÑù£¬¼ÙÉèÓû§ÉÏ´« 1G Îļþ£¬»òÕß¶ÁÈ¡±¾µØ 1G
µÄÎļþ¡£Èç¹ûûÓÐÊý¾ÝÁ÷µÄ¸ÅÄÎÒÃÇÐèÒª¿ª±Ù 1G ´óСµÄ»º³åÇø£¬È»ºóÔÚ»º³åÇøÂúºóÒ»´ÎÐÔ¼¯Öд¦Àí¡£
Èç¹ûÊDzÉÓÃÊý¾ÝÁ÷µÄ·½Ê½£¬ÎÒÃÇ¿ÉÒÔ¶¨ÒåºÜСµÄÒ»¿é»º³åÇø£¬±ÈÈç´óСÊÇ 1Mb¡£µ±»º³åÇøÂúºó¾ÍÖ´Ðлص÷º¯Êý£¬¶ÔÕâһС¿éÊý¾Ý½øÐд¦Àí£¬´Ó¶ø±ÜÃâ³öÏÖ»ýѹ¡£
ʵ¼ÊÉÏ request ºÍ fs Ä£¿éµÄÎļþ¶ÁÈ¡¶¼ÊÇÒ»¸ö¿É¶ÁÊý¾ÝÁ÷:
var fs = require('fs'); var readableStream = fs.createReadStream('file.txt'); var data = ''; readableStream.setEncoding('utf8'); // ÿ´Î»º³åÇøÂú£¬´¦ÀíһС¿éÊý¾Ý chunk readableStream.on('data', function(chunk) { data+=chunk; }); // ÎļþÁ÷È«²¿¶ÁÈ¡Íê³É readableStream.on('end', function() { console.log(data); }); |
ÀûÓùܵÀ¼¼Êõ£¬¿ÉÒÔ°ÑÒ»¸öÁ÷ÖеÄÄÚÈÝдÈëµ½ÁíÒ»¸öÁ÷ÖÐ:
var fs = require('fs'); var readableStream = fs.createReadStream('file1.txt'); var writableStream = fs.createWriteStream('file2.txt'); readableStream.pipe(writableStream); |
²»Í¬µÄÁ÷»¹¿ÉÒÔ´®Áª(Chain)ÆðÀ´£¬±ÈÈç¶Áȡһ¸öѹËõÎļþ£¬Ò»±ß¶Áȡһ±ß½âѹ£¬²¢°Ñ½âѹÄÚÈÝдÈëµ½ÎļþÖÐ:
var fs = require('fs'); var zlib = require('zlib'); fs.createReadStream('input.txt.gz') .pipe(zlib.createGunzip()) .pipe(fs.createWriteStream('output.txt')); |
Node.js ÌṩÁ˷dz£¼ò½àµÄÊý¾ÝÁ÷²Ù×÷£¬ÒÔÉϾÍÊǼòµ¥µÄʹÓýéÉÜ¡£
×ܽá
¶ÔÓڸ߲¢·¢µÄ³¤Á¬½Ó£¬Ê¼þÇý¶¯Ä£ÐͱÈÏß³ÌÇáÁ¿µÃ¶à£¬¶à¸ö Node.js ½ø³ÌÅäºÏ¸ºÔؾùºâ¿ÉÒÔ·½±ãµÄ½øÐÐÍØÕ¹¡£Òò´Ë
Node.js ·Ç³£ÊʺÏΪ I/O Ãܼ¯ÐÍÓ¦ÓÃÌṩ·þÎñ¡£µ«ÕâÖÖ·½Ê½µÄȱÏݾÍÊDz»Éó¤´¦Àí CPU Ãܼ¯ÐÍÈÎÎñ¡£
Node.js ÖÐͨ³£ÒÔÁ÷µÄ·½Ê½À´ÃèÊöÊý¾Ý£¬Ò²¶Ô´ËÌṩÁ˺ܺõķâ×°¡£
Node.js ʹÓÃǰ¶ËÓïÑÔ(JavaScript) ¿ª·¢£¬Í¬Ê±Ò²ÊÇÒ»¸öºó¶Ë·þÎñÆ÷£¬Òò´ËΪǰºó¶Ë·ÖÀëÌṩÁËÒ»¸öÁ¼ºÃµÄ˼·¡£ÎÒ»áÔÚÏÂһƪÎÄÕÂÖжԴ˽øÐзÖÎö¡£ |