Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ΪʲôҪÓà Node.js
 
À´Ô´£ºÍøÂç ·¢²¼ÓÚ 2017-5-2
  2000  次浏览      27
 

ÕªÒª: ´«Í³ÒâÒåÉ쵀 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) ¿ª·¢£¬Í¬Ê±Ò²ÊÇÒ»¸öºó¶Ë·þÎñÆ÷£¬Òò´ËΪǰºó¶Ë·ÖÀëÌṩÁËÒ»¸öÁ¼ºÃµÄ˼·¡£ÎÒ»áÔÚÏÂһƪÎÄÕÂÖжԴ˽øÐзÖÎö¡£

   
2000 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕ Ïà¹ØÎĵµ Ïà¹Ø¿Î³Ì



Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Àí½âJavascript
·ÇµäÐÍajaxʵ¼ù
³¹µ×µÄAjax
javascript ʹÓÃCookies
ʹÓà jQuery ¼ò»¯ Ajax ¿ª·¢

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

ijº½¿Õ¹«Ë¾IT²¿ JavaScriptʵ¼ù
ijµçÊÓÈí¼þ HTML5ºÍJavaScript
Öк½ÐÅ JavaScript¸ß¼¶Ó¦Óÿª·¢
´óÇìÓÍÌï web½çÃæAjax¿ª·¢¼¼Êõ
ºÍÀûʱ ʹÓÃAJAX½øÐÐWEBÓ¦Óÿª·¢