| <!doctype html> |
| <html lang="en"> |
| <head> |
| <meta charset="utf-8"> |
| <link type="image/x-icon" rel="icon" href="../favicon.ico"> |
| <link type="image/x-icon" rel="shortcut icon" href="../favicon.ico"> |
| <link rel="stylesheet" href="../pipe.css"> |
| <link rel="stylesheet" href="../sh.css"> |
| <link rel="alternate" |
| type="application/rss+xml" |
| title="node blog" |
| href="http://feeds.feedburner.com/nodejs/123123123"> |
| <title>node.js</title> |
| </head> |
| <body class="alt int" id="about"> |
| <div id="intro" class="interior"> |
| <a href="/" title="Go back to the home page"> |
| <img id="logo" src="http://nodejs.org/images/logo-light.png" alt="node.js"> |
| </a> |
| </div> |
| <div id="content" class="clearfix"> |
| <div id="column2" class="interior"> |
| <ul> |
| <li><a href="/" class="home">Home</a></li> |
| <li><a href="/download/" class="download">Download</a></li> |
| <li><a href="/about/" class="about current">About</a></li> |
| <li><a href="http://npmjs.org/" class="npm">npm Registry</a></li> |
| <li><a href="http://nodejs.org/api/" class="docs">Docs</a></li> |
| <li><a href="http://blog.nodejs.org" class="blog">Blog</a></li> |
| <li><a href="/community/" class="community">Community</a></li> |
| <li><a href="/logos/" class="logos">Logos</a></li> |
| <li><a href="http://jobs.nodejs.org/" class="jobs">Jobs</a></li> |
| </ul> |
| <p class="twitter"><a href="http://twitter.com/nodejs">@nodejs</a></p> |
| </div> |
| |
| <div id="column1" class="interior"> |
| <h1>Node's goal is to provide an easy way to build scalable |
| network programs</h1> |
| |
| |
| <p>In the "hello world" web server example |
| below, many client connections can be handled concurrently. |
| Node tells the operating system (through <code>epoll</code>, |
| <code>kqueue</code>, <code>/dev/poll</code>, or |
| <code>select</code>) that it should be notified when a new |
| connection is made, and then it goes to sleep. If someone new |
| connects, then it executes the callback. Each connection is |
| only a small heap allocation.</p> |
| |
| <pre> |
| var http = require('http'); |
| http.createServer(function (req, res) { |
| res.writeHead(200, {'Content-Type': 'text/plain'}); |
| res.end('Hello World\n'); |
| }).listen(1337, "127.0.0.1"); |
| console.log('Server running at http://127.0.0.1:1337/');</pre> |
| <p>This is in contrast to today's more common concurrency |
| model where OS threads are employed. Thread-based networking |
| is relatively inefficient and very difficult to use. See: <a |
| href="http://www.kegel.com/c10k.html">this</a> and <a |
| href="http://bulk.fefe.de/scalable-networking.pdf">this</a>. |
| Node will show much better memory efficiency under high-loads |
| than systems which allocate 2mb thread stacks for each |
| connection. Furthermore, users of Node are free from worries |
| of dead-locking the process—there are no locks. Almost no |
| function in Node directly performs I/O, so the process never |
| blocks. Because nothing blocks, less-than-expert programmers |
| are able to develop fast systems.</p> |
| |
| <p>Node is similar in design to and influenced by systems like |
| Ruby's <a href="http://rubyeventmachine.com/">Event |
| Machine</a> or Python's <a |
| href="http://twistedmatrix.com/">Twisted</a>. Node takes the |
| event model a bit further—it presents the event loop as a |
| language construct instead of as a library. In other systems |
| there is always a blocking call to start the event-loop. |
| Typically one defines behavior through callbacks at the |
| beginning of a script and at the end starts a server through a |
| blocking call like <code>EventMachine::run()</code>. In Node |
| there is no such start-the-event-loop call. Node simply enters |
| the event loop after executing the input script. Node exits |
| the event loop when there are no more callbacks to perform. |
| This behavior is like browser javascript—the event loop is |
| hidden from the user.</p> |
| |
| <p>HTTP is a first class protocol in Node. Node's HTTP library |
| has grown out of the author's experiences developing and |
| working with web servers. For example, streaming data through |
| most web frameworks is impossible. Node attempts to correct |
| these problems in its HTTP <a |
| href="https://github.com/joyent/http-parser/tree/master">parser</a> |
| and API. Coupled with Node's purely evented infrastructure, it |
| makes a good foundation for web libraries or frameworks.</p> |
| |
| <p>But what about multiple-processor concurrency? Aren't |
| threads necessary to scale programs to multi-core computers? |
| You can start new processes via <code><a |
| href="http://nodejs.org/api/child_process.html#child_process.fork">child_process.fork()</a></code> |
| these other processes will be scheduled in parallel. For load |
| balancing incoming connections across multiple processes use |
| <a href="http://nodejs.org/api/cluster.html">the |
| cluster module</a>.</p> |
| |
| <p>See also:</p> |
| <ul> |
| <li><a href="http://s3.amazonaws.com/four.livejournal/20091117/jsconf.pdf">Slides from JSConf 2009</a></li> |
| <li><a href="http://nodejs.org/jsconf2010.pdf">Slides from JSConf 2010</a></li> |
| <li><a href="http://www.yuiblog.com/blog/2010/05/20/video-dahl/">Video from a talk at Yahoo in May 2010</a></li> |
| </ul> |
| </div> |
| </div> |
| <div id="footer"> |
| <a href="http://joyent.com" class="joyent-logo">Joyent</a> |
| <ul class="clearfix"> |
| <li><a href="/">Node.js</a></li> |
| <li><a href="/#download">Download</a></li> |
| <li><a href="/about/">About</a></li> |
| <li><a href="http://npmjs.org/">npm Registry</a></li> |
| <li><a href="http://nodejs.org/api/">Docs</a></li> |
| <li><a href="http://blog.nodejs.org">Blog</a></li> |
| <li><a href="/community/">Community</a></li> |
| <li><a href="/logos/">Logos</a></li> |
| <li><a href="http://jobs.nodejs.org/">Jobs</a></li> |
| <li><a href="http://twitter.com/nodejs" class="twitter">@nodejs</a></li> |
| </ul> |
| |
| <p>Copyright <a href="http://joyent.com/">Joyent, Inc</a>, Node.js is a <a href="/trademark-policy.pdf">trademark</a> of Joyent, Inc. View <a href="https://raw.github.com/joyent/node/__VERSION__/LICENSE">license</a>.</p> |
| </div> |
| |
| |
| <script src="../sh_main.js"></script> |
| <script src="../sh_javascript.min.js"></script> |
| <script>highlight(undefined, undefined, 'pre');</script> |
| |
| <script> |
| window._gaq = [['_setAccount', 'UA-10874194-2'], ['_trackPageview']]; |
| (function(d, t) { |
| var g = d.createElement(t), |
| s = d.getElementsByTagName(t)[0]; |
| g.src = '//www.google-analytics.com/ga.js'; |
| s.parentNode.insertBefore(g, s); |
| }(document, 'script')); |
| </script> |
| |
| </body> |
| </html> |