有些人说“这是一种通过javascript语言开发web服务端的东西”。更直白的可以理解为:node.js有非阻se塞,事件驱动/O等特性,从而让高并发(high concurrency)在的轮询和comet构建的应用中成为可能。

  浏览器给网站发请求的过程一直没怎么变过。当浏览器给网站发了请求,服务器收到了请求,然后开始搜寻被请求的资源。如果有需要,服务器还会查询一下数据库,最后把响应结果传回浏览器。不过,在传统的web服务器中,比如apache服务器,每一个请求都会让服务器创建一个新的进程来处理这个请求。

  后来又了ajax。有了ajax,我们就不用每次都请求一个完整的新页面了,取而代之的是每次只请求需要的部分就可以了。这显然是一个进步。但是比如你要建一个FriendFeed这样的社交网站(类似人人网那样的刷朋友新鲜事的网站),你的好友会随时的推送新的状态,然后你的新鲜事会实时自动刷新。要达成这个需求,我们需要让用户一直与服务器保持一个有效链接。目前最简单的实现方法就是让用户和服务器之间保持长轮询(long polling)。

  http请求不是持续的链接,你请求一次,服务器响应一次,然后就完了。长轮询是一种利用http模拟持续连接的技巧。具体来说或,只要页面载入了,不管你需不需要服务器给你相应信息,你都会给服务器发一个ajax请求。这个请求不同于一般的ajax请求,服务器不会直接给你返回信息,而是它要等着,直到服务器觉得该给你发信息了,它才会响应。比如,你的好友发了一条新鲜事,服务器就会把这个新鲜事当作响应发给你的浏览器,然后你的浏览器就刷新页面了。浏览器收到响应刷新完之后,再发送一条新的请求给服务器,这个请求依然不会立即被响应。于是就开始重复以上步骤。利用这个方法,可以让浏览器始终保持等待响应的状态。虽然以上过程依然只有非持续的http参与,但是我们模拟出了一个看似持续的连接状态

我们再看传统的服务器比如apache。每次一个新用户连到你的网站上,你的服务器就得开一个连接,每个连接都需要占用一个进程,这些进程大部分时间都是闲着的(比如等着你的好友发新鲜事,等好友发完才给用户响应信息。或者等着数据库返回查询结果什么的)。虽然这些进程闲着,但是照样占用内存。这意味着,如果用户连接数的增长到一定规律,你服务器没准就要耗光内存直接瘫痪了。

这种情况怎么解决?解决的方法就是刚才上边说的:非阻塞和事件驱动。这些概念在我们谈的这个情景里面其实也没那么难理解。把非阻塞的服务器想象成一个loop循环,这个loop会一个跑下去。一个新请求来了,这个loop就接了这个请求,把这个请求传给其他的进程(比如传给一个搞数据库查询的进程),然后响应一个回调(callback)。完事了这个loop继续跑,接其他的请求。这样下来,服务器就不会像之前那样傻等着数据库返回结果了。

如果数据库把结果返回了,loop就把结果传回用户的浏览器。接着继续跑。在这种方式下,你的服务器的进程就不会闲着等着了。从而在理论上说,同一时刻的数据库查询数量,以及用户的请求数量就没有限制了。服务器只在用户那边有事发生的时候才响应,这就是事件驱动。

FriendFeed是用基于Python的非阻塞框架Tornado(知乎也用了这个框架)来实现上面说的新鲜事功能的。不过nodejs就比前者更妙了。nodejs的应用是通过javascript开发的,然后直接在google的变态V8引擎上跑。用了nodejs,你就不用担心担心用户端的请求会在服务器里跑了一段能够造成阻塞的代码了。因为javascript本身就是事件驱动的脚本语言。你回想一下,在给前端写javascript的时候,更多时候你都是在搞事件处理和回掉函数。javascript本身就是给事件处理量身定制的语言。

nodejs是用来做什么的?的更多相关文章

  1. NodeJS什么都能做,为什么还要JAVA?

    这张图看起来简单而且很好理解,但没尝试过,会有很多疑问. SPA模式中,后端已供了所需的数据接口,view前端已经可以控制,为什么要多加NodeJS这一层? 多加一层,性能怎么样? 多加一层,前端的工 ...

  2. 使用nodejs引用socket.io做聊天室

    Server: var app = require('http').createServer(handler) , io = require('socket.io').listen(app) , fs ...

  3. 使用Nodejs 的http-proxy 模块做代理服务器的尝试

    参考 : https://blog.csdn.net/zhihuoqian9683/article/details/78944482  (亲测可行) http://www.mizuiren.com/4 ...

  4. Nodejs学习路线图

    前言 用Nodejs已经1年有余,陆陆续续写了48篇关于Nodejs的博客文章,用过的包有上百个.和所有人一样,我也从Web开发开始,然后到包管 理,再到应用系统的开发,最后开源自己的Nodejs项目 ...

  5. 【NodeJS 学习笔记02】入门资源很重要

    前言 在我映像中,异步最早出现与ajax,当时我还在搞.net,然后.net居然出了一个异步的控件...... 虽然我最后知道了他不是异步的......然后,前端异步用得特别多,如果不是异步的程序,你 ...

  6. 基于NodeJS的全栈式开发

    前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了“前后端”的定义,引入前端同学都熟悉的 NodeJS,试 ...

  7. nodejs学习之文件上传

    最近要做个图片上传的需求,因为服务端春节请假回家还没来,所以就我自己先折腾了一下,大概做出来个效果,后台就用了nodejs,刚开始做的时候想网上找一下资料,发现大部分资料都是用node-formida ...

  8. (转)也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离)

    原文链接:http://ued.taobao.org/blog/2014/04/full-stack-development-with-nodejs/ 随着不同终端(pad/mobile/pc)的兴起 ...

  9. NodeJS服务器:一行代码 = 一个的HTTP服务器

    从这一篇开始,我们进入技术讲解的话题,逐步实现用NodeJS实现文件的传送共享服务. 前文我们讲过,NodeJS是最擅长做网络服务器的,今天我们就来用NodeJS做一个最简单的服务器. 先看一幅图: ...

随机推荐

  1. Java输出日历写法

    package TestString_2; import java.text.ParseException;import java.util.Calendar;import java.util.Gre ...

  2. 项目总结(二)->一些常用的工具浅谈

    程序员是否应该沉迷于一个编程的世界,为了磨砺自己的编程技能而两耳不闻窗外事,一心只为写代码:还是说要做到各有涉猎,全而不精.关于这点每个人心中都有一套自己的工作体系和方法体系. 我一直认为,程序员你首 ...

  3. SPRITEKIT游戏框架之关于PHYSICS物理引擎属性

    Spritekit提供了一个默认的物理模拟系统,用来模拟真实物理世界,可以使得编程者将注意力从力学碰撞和重力模拟的计算中解放出来,通过简单地代码来实现物理碰撞的模拟,而将注意力集中在更需要花费精力的地 ...

  4. Visual Studio各版本工程文件之间的转换 [转载]

    原网址:http://www.cnblogs.com/jmliao/p/5594179.html Visual Studio各版本工程文件之间的转换   由于VS版本比较多,低版本无法直接打开高版本的 ...

  5. 团队项目-第五次Scrum 会议

    时间:10.31 时长:30分钟 地点:教室(主南201) 工作情况 团队成员 已完成任务 待完成任务 解小锐 修复在接受任务时,前端和后端对接中的bug 完成员工信息的简单初始化 陈鑫 完成hire ...

  6. JavaWeb笔记(十二)日志

    日志 日志信息根据用途与记录内容的不同,分为调试日志.运行日志.异常日志等. Java常用记录日志 logger log4j log4j2 logback 其中除了logger使用的概率较小,因此主要 ...

  7. SpringMVC 上传图片保存到服务器 同时更改图片名称保存至数据库

    @RequestMapping(value = "/save.do", method = RequestMethod.POST)    public String saveDriv ...

  8. asp.net应用程序脱机app_offline.htm文件

    This application is currently offline. To enable the application, remove the app_offline.htm file fr ...

  9. 物联网PPT智能家居王思齐和陈由钧第10组

    ppt做完了但是不知道怎么用博客园发ppt!只能发几个图片了

  10. red入门学习笔记

    删除以name开头的所有键值. 查找开头和结尾相同,中间字符不同