nodejs大数据量并发.js真的有高并发优势吗

基于Node.js高并发web系统的研究与应用 网络系统 Node js 高并发 大数据 研究..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于Node.js高并发web系统的研究与应用
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口我在BAT学到的技术工具-使用nodejs搭建支持高并发的http服务 - 简书
下载简书移动应用
写了24371字,被69人关注,获得了87个喜欢
我在BAT学到的技术工具-使用nodejs搭建支持高并发的http服务
1. 面对的需求
图片标签商品服务,类似产品:nice,商品滤镜:
单图片维度
tag标签维度
获取指定图片中的tag内容 输入:objurl,userid 输出:tag list
获取指定话题(如:"G-SHOCK")下面所有的图片 输入:tagname 输出:objurl list,tag desc 等信息
为某个图片添加标签tag 输入:objurl, userid, tagname(这个为了归一化,前端会有选择引导) 输出:是否成功
2. 可选的技术方案
2种技术方案A/B
php 使用lighty 配置fastcgi模式
nodejs使用lighty配置redirect模式
由于搜索核心的流量经过php集群,所以,本次从开发效率,并发请求支持效率(单机qps)上考虑使用nodejs搭建后端服务
3. 基于nodejs的技术方案
nodejs完成连接接入,结果处理拼装的工作,其中使用到了几个很好用的插件。
: 类似服务端的supervise,当进程意外崩溃后自动重启动;
由于nodejs是单进程模型,pm2支持自动部署为多进程运行,可以更好的利用服务器cpu;
redis:支持的nodejs的redis proxy
redis 使用了set作为value类型,牺牲部分性能达到去除重复标签的功能。
管理redis的web 工具
4. 效果总结
实际压力测试,读写混合的pv单机可以在1W qps左右。
总结nodejs适合应用场景:高并发流量,不是很重的处理逻辑,http服务层。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
简书程序员大本营
投稿须知:
1.本专题仅收录与程序有关的文章。
2.请在代码框里写代码,尽量保证可看性。
· 52576人关注
序员,程序猿,是::软件工程师!!
· 5129人关注
把我知道的都告诉你
· 1936人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
华南理工大学【软件工程】本科毕业设计(论文):基于 Node.js 的 社区游戏系统的设计与实现.pdf39页
本文档一共被下载:
次 ,您可免费全文在线阅读后下载本文档
文档加载中...广告还剩秒
需要金币:200 &&
你可能关注的文档:
··········
··········
本科毕业 设计(论 文)基于 Node.js 的 社 区 游 戏 系 统 的
设计与实现学
院软 件学 院
业软 件工 程
学 生姓 名黄聪学 生学 号
指 导教 师
提 交日 期年 月 日摘
Node.js 是新兴的JavaScript 虚拟机, 基于V8 引擎实现的事件驱动IO, 性能很好,
受众热捧。Node.js 有很多鲜明的特性,包括使用 JavaScript 语言、异步 IO 非阻塞、
单线程、事件驱动等。随着 NoSQL 的兴起,MongoDB 也是备受关注。它是功能很丰富 ,
是一个 广受好评 的 最像关系数据库的非关系数据库。 本项目是 一个基于 MongoDB 和
Node.js 的社区在线游戏 ,是个类似名叫 Bonbons 桌游的多人在线游戏,让用户选择中
央牌池的牌和手牌, 图案相同即配对成功, 第一个完成所有配对的用户胜利。 本项目包
括用户管理、 游戏大厅、 游戏房间三大功能模块。 用户管理模块是本项目最基础 的一个
模块, 几乎每一个页面, 每一个步骤, 都会调用这个模块的接口, 这个模块包括用户登
录退出和用户信息存储两个小模块。 游戏大厅模块是一个相对简单的模块, 主要 起着衔
接的作用, 也就是把用户从介绍首页引导到游戏房间的过渡模块, 它包括消息同步和引
导进入房间两 个部 分 。游 戏 房 间 模 块 是整 个 游戏 最 重 要 的 部 分, 是 本项 目 的 灵 魂 所 在 ,
它包含了整个游戏过程的逻辑与实现。 该模块同样包含消息同步的部分, 还包含会话控
制部分以及游戏逻辑部分(各种消息或事件的处理和响应) 。
关 键词 :Node.MongoDB ;游戏
The Node.js powerful new event-driven asynchronous IO JavaScript virtual machine,
based on the V8 engine, achieving high performance is focused by a lot of people. Node.js
have many distinctive features, including the use of JavaScript language, asynchronous
non-blocking
正在加载中,请稍后...IBM Bluemix
点击按钮,开始云上的开发!
developerWorks 社区
如果经常浏览各大技术网站,那么你会发现自己很难错过 Node.js,程序员们兴奋地说:JavaScript 也可以开发服务器端的程序了!没错,Node.js 的确为我们提供了这种便利,前台后台都用同一种语言实现。但这种兴奋,却极易掩盖 Node.js 另外一个重要的特性:基于事件驱动的编程模型。而后者,才真正使得 Node.js 成为开发高并发大型网络应用的关键。本文详细介绍了 Node.js 的核心,即基于事件驱动的编程模型,并与传统的单线程和多线程编程模型进行对比。文章最后提供了一个完整的 Web 应用,帮助您理解 Node.js 的编程方式。
, 软件工程师,
王群锋现供职于 IBM 中国研发中心,从事统计数据可视化的工作。
Node.js 被设计用来开发大规模高并发的网络应用,这种网络应用的瓶颈之一是在 I/O 的处理效率上。由于硬件及网络的限制,I/O 的速度往往是固定的,如何在此前提下尽可能处理更多的客户请求,提高 CPU 使用效率,便成了开发人员面临的最大问题。得益于基于事件驱动的编程模型,Node.js 使用单一的 Event loop 线程处理客户请求,将 I/O 操作分派至各异步处理模块,既解决了单线程模式下 I/O 阻塞的问题,又避免了多线程模式下资源分配及抢占的问题。至于使用 JavaScript 开发服务器端代码,这并不是什么新鲜事物,JavaScript 本来就是一种完备的编程语言,微软的 IIS 服务器很早就支持 JavaScript 在其中运行。本文将重点讲述 Node.js 基于事件的编程模型,并与传统的处理方式进行对比,帮助您更好的理解 Node.js。网络应用的性能瓶颈网络应用的性能瓶颈之一在于 I/O 处理上,下表来自 Node.js 的作者 Ryan Dahl 为 JSConf 大会所作的 ,对比了在不同介质上进行 I/O 操作所花费的 CPU 时间。您能够清楚的发现,访问磁盘及网络数据所花费的 CPU 时间是访问内存时的数十万倍,而现在的网络应用,却需要大量的访问磁盘及网络,比如数据库查询、访问互联网等。如何提高此时 CPU 的利用效率,便成了提升网络应用性能的关键。表 1. 不同介质下 I/O 操作花费对比I/OCPU Cycle
传统的处理方式单线程清单 1. 单线程下的阻塞式 I/O var result =
db.query("select * from T");
// 使用该查询结果上述代码描述了一个常见的案例,客户端发起一个 I/O 请求,然后等待服务器端返回 I/O 结果,结果返回后再对其进行操作,但这种请求常常需要很长时间(对于服务器的 CPU 处理能力来说)。这一过程中,服务器无法接受新的请求,即阻塞式 I/O。这种处理方式虽然简单,却不实用,尤其是面对大量请求的时候,简直就不可用。这种情景类似在火车站售票窗口排队买票,如果您在春节期间去北京火车站排队买过票,绝不会认为这是一种好的处理方式。庆幸的是,现在很少有服务器采取这种处理方式。多线程清单 2. 多线程下的阻塞式 I/O var result =
db.query("select * from T");
// 使用该查询结果该方式下,服务器为每个请求分配一个线程,所有任务均在该线程内执行,就像火车站多开了几个卖票窗口,处理效率高了许多。但就如读者看到的那样,在春节期间各个售票窗口前还是人满为患,为什么火车站不再多开一些售票窗口呢?当然是因为成本。线程也一样,服务器每创建一个线程,每个线程大概会占用 2M 的系统内存,而且线程之间的切换也会降低服务器的处理效率,基于成本的考虑,这种处理方式也有一定的局限性。然而,这却不是最主要的,主要的是开发多线程程序非常困难,容易出错。程序员需考虑死锁,数据不一致等问题,多线程的程序极难调试和测试。基本上在程序运行出错的时候,程序员才知道自己的程序有错误。而这种错误的代价往往又是巨大的,那些访问量巨大的电子商务网站时常会曝出价格错误等导致公司损失的新闻。事件驱动清单 3. 基于事件驱动的编程模型 db.query("select..", function (result) {
// 使用该查询结果
// 继续干其他的事
// ……上述代码的好处是:使用一个线程执行,客户发起 I/O 请求的同时传入一个函数,该函数会在 I/O 结果返回后被自动调用,而且该请求不会阻塞后续操作。就像电话订票,设想你一大早来到办公室,给火车站打个电话,将自己的票务信息,地址告诉对方,然后放下电话,泡杯茶,浏览一下网页,回复一下今天的电子邮件,你完全不用管火车票的事了,如果订到票,火车站会派快递公司按你电话中提到的联系方式送票给你。无疑,这是一种极其理想的处理方式。下图说明了这种编程模型,所有请求以及同时传入的回调函数均发送至同一线程,该线程通常叫做 Event loop 线程,该线程负责在 I/O 执行完毕后,将结果返回给回调函数。这里要注意的是 I/O 操作本身并不在该线程内执行,所以不会阻塞后续请求。图 1. Event loopNode.js 简介有了上面对于事件处理编程模型的介绍,Node.js 就很好理解了。Node.js 是采用事件处理编程模型的 JavaScript 平台,它允许程序员开发大规模高并发的网络应用。这个概念并不新鲜,在 Node.js 之前,很多语言都提供了类似的平台:Python 的 Twisted,Perl 的 AnyEvent,Ruby 的 EventMachine。Node.js 优于其他平台的另一个好处是所有的 I/O 操作都以异步方式实现,让程序员将主要精力放在应用的业务逻辑上。为什么选用 JavaScript事实上,在实现 Node.js 之初,作者 Ryan Dahl 并没有选择 JavaScript,他尝试过 C、Lua,皆因其欠缺一些高级语言的特性,如闭包、函数式编程,致使程序复杂,难以维护。而 JavaScript 则是支持函数式编程范型的语言,很好地契合了 Node.js 基于事件驱动的编程模型。加之 Google 提供的 V8 引擎,使 JavaScript 语言的执行速度大大提高。最终呈现在我们面前的就成了 Node.js,而不是 Node.c,Node.lua 或其他语言的实现。一个例子本文将在这里使用 Node.js 实现一个小型的 Web 应用,它将随机为用户显示一条谚语或名人名言,并允许浏览者添加自己喜欢的谚语。用 Node.js 开发 Web 应用非常简单,下面这段一百多行的代码就实现了一个完整的应用。如果您尚未安装好 Node.js,请登录其 查看详细安装说明。清单 4. 导入所需要的模块(proverbs.js) // 导入所需模块
var http = require("http");
var url = require("url");
var qs = require('querystring');首先需要导入该应用所需要的模块,其中 http 模块负责创建 Web 服务器及 HTTP 相关服务,url 模块负责解析 URL 地址,querystring 模块负责处理请求参数。清单 5. 数据存储(proverbs.js) // 这里为了方便使用了全局变量
var proverbs = [
"The turtle wins the race.",
"God hides in the details.",
"There are two ways to write error- only the third one works.",
"Perfect practice makes perfect."
];这里为了方便,使用全局变量 proverbs存储已有谚语,在正式的应用中,应该考虑使用文件或数据库存储。清单 6. 创建 Web 服务器(proverbs.js) // 创建一个 Web 服务器
http.createServer(onRequest).listen(8888);
console.log("server is running...");使用 Node.js 开发 Web 应用非常简单,甚至不用配置 Web 服务器,一行代码就创建成功一个 Web 服务器,同时传入一个回调函数,服务器创建成功后,代码并没有阻塞到那里,而是接着往下执行,这就是事件驱动模型的编程风格,在 Node.js 里将会大量采用这种方式。清单 7. 请求处理函数(proverbs.js) // 请求处理函数
function onRequest(request, response) {
var pathname = url.parse(request.url).
console.log("Reqeust for " + pathname + " received.");
if (pathname === "/" || pathname === "/index" || pathname === "/proverb") {
getProverb(response);
} else if (pathname === "/add") {
if (request.method.toLowerCase() == 'post') {
var body = '';
request.on('data', function(data) {
request.on('end', function() {
var POST = qs.parse(body);
add(POST.text, response);
addProverb(response);
response.writeHead(404, {
"Content-Type" : "text/plain"
response.write("404 Not found");
response.end();
}该函数负责分发请求,将接收到的 URL 根据规则转发至对应的请求处理模块。清单 8. GET 请求(proverbs.js) function getProverb(response) {
var body = '&html&'
+ '&head&'
+ '&meta http-equiv="Content-Type" content="text/ '
+ 'charset=UTF-8" /&'
+ '&/head&'
+ '&body style="font-size: 4line-height: 1.2; margin-top: 200;"&'
+ '&blockquote&'+ proverbs[Math.floor(Math.random()* proverbs.length)]
+ '&/blockquote&' + '&/body&'
+ '&/html&';
response.writeHead(200, {
"Content-Type" : "text/html"
response.write(body);
response.end();
}该函数负责处理 GET 请求,随机向用户返回一条谚语。细心的读者可能会发现该函数将 HTML,CSS 以及数据混在一起,显然不符合 MVC 的编程模式。Node.js 有很多第三方开发的模块,其中 就是一款优秀的 Web 开发框架,有兴趣的读者可以研究一下。清单 9. 用户输入表单(proverbs.js) function addProverb(response) {
var body = '&html&'
+ '&head&'
+ '&meta http-equiv="Content-Type" content="text/ '
+ 'charset=UTF-8" /&'
+ '&/head&'
+ '&body style="font-size: 4line-height: 1.2; margin-top: 200;"&'
+ '&form action="/add" method="post"&'
+ '&textarea name="text" rows="10" cols="60"&&/textarea&&p&'
+ '&input type="submit" value="Submit"
/&' + '&/form&' + '&/body&'
+ '&/html&';
response.writeHead(200, {
"Content-Type" : "text/html"
response.write(body);
response.end();
}该函数返回一个 HTML 表单,允许用户输入自己喜欢的谚语或格言。清单 10. POST 请求(proverbs.js) function add(proverb, response) {
proverbs.push(proverb);
var body = '&html&'
+ '&head&'
+ '&meta http-equiv="Content-Type" content="text/ '
+ 'charset=UTF-8" /&'
+ '&/head&'
+ '&body style="font-size: 4line-height: 1.2; margin-top: 200;"&'
+ '&blockquote&' + proverb + '&/blockquote&' + '&/body&'
+ '&/html&';
response.writeHead(200, {
"Content-Type" : "text/html"
response.write(body);
response.end();
}该函数负责用户的 POST 请求,将用户输入保存到服务器端,并返回给用户结果。结束语本文给大家介绍了基于事件的编程模型,这种编程模型正是 Node.js 这项最近流行技术的核心,希望读者能利用 Node.js 的优势,为自己的开发工作带来便利。
参考 官方主页,了解 Node.js。
:一个非常好的 Node.js 教程,同时介绍了 JavaScript 中的高级特性。
:一篇有助于理解 Node.js 的文章。
深入介绍了基于事件驱动的编程模型,并与传统的处理方式进行对比。
“”(developerWorks,2011 年 6 月):你们中的许多人可能听说过新近出现的 Node.js,也许现在还在猜测它究竟是何物?Michael Abernethy 在本文中简要介绍了 Node 的作用及其当前局限性。“”(developerWorks,2011 年 8 月):本文探讨 Node.js,这是一个用于 UNIX 类平台上 V8 JavaScript 引擎的事件驱动的 I/O 框架,设计这一框架的目的是为了编写可伸缩的网络程序,如 Web 服务器。本文通过一个完整的例子说明如何在 Node.js 中构建聊天服务器,分析了这个框架以及围绕它的生态系统(包括云计算产品),并对这个框架进行了总结。“”(developerWorks,2011 年 7 月):node.js 是一个可以使用 JavaScript 开发服务器端应用的平台。它依托于 Google V8 JavaScript 引擎,并采用事件 I/O 的架构,可以用来创建高性能服务器。本文详细介绍了 node.js 的基本知识、模块化的结构、事件驱动的机制以及常用的模块。“”(developerWorks,2011 年 12 月):Node.js 是一种激动人心的开发方式,可替代传统的 Java 并发性,只要有一个开放的心态和一点点 JavaScript 知识,就可以立即开始进行开发。:通过专门关于 Web 技术的文章和教程,扩展您在网站开发方面的技能。:这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。,这是有关 Web 2.0 相关信息的一站式中心,包括大量 Web 2.0 技术文章、教程、下载和相关技术资源。您还可以通过
栏目,迅速了解 Web 2.0 的相关概念。加入 。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
文章、教程、演示,帮助您构建、部署和管理云应用。
立即加入来自 IBM 的专业 IT 社交网络。
为灾难恢复构建应用,赢取现金大奖。
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Web developmentArticleID=788231ArticleTitle=被误解的 Node.js
publish-date=

我要回帖

更多关于 nodejs大数据量并发 的文章

 

随机推荐