大佬教程收集整理的这篇文章主要介绍了【译】Node.js的速度困境:AJAX 和 Socket.IO到底选哪个?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
当我开始自己的第一个Node.js项目时,我发现的第一件事就是如何处理浏览器(客户端)和中间件之间的通信(中间件是用CUBRID Node.js驱动编写的(node-cubrid)的Node.js应用与CUBRID 8.4.1数据库交换信息)。
我已经非常熟悉AJAX了,但是在学习Node.js时,我发现了Socket.IO模块,甚至在互联网上发现了一些非常不错的代码示例... 非常好用(重用)...
因此,这很快成为一个难题:应该选哪个,Ajax还是sockets.io?
显然,由于我的经验非常有限,所以我需要更多的信息。换句话说,应该好好的Google一番 :)
显然相关的信息非常多,但是需要过滤掉那些没用的 "噪音",并得到真正有用的东西。让我跟大家分享一下关于这个话题的一些链接:
总而言之,这是我发现的:
Socket.IO(通常)用的是客户端和服务器(中间件)之间的持续连接,因此你会达到服务器端资源所允许的并发连接数上限(而相同的资源可以支持更多的AJAX异步请求)。
使用AJAX,你可以请求RESTful接口。这意味着您可以利用现有的 http 服务,例如:代理缓存请求和带条件的GET请求。
与 Socket.IO 相比,AJAX 有更多(通信)数据开销(例如:http头,Cookie等)。
AJAX通常比Socket.IO快 ...
当使用Socket.IO时,可以进行双向通信,其中每一方——客户端或服务器都可以发起请求。在AJAX中,只有客户才能发起请求!
Socket.IO有更多的传输选项,包括Adobe Flash。
现在,对于我自己的应用,我最感兴趣的是发起请求并从(Node.js)服务器获取数据的速度!
关于与CUBRID数据库中间件的数据通信,因为大约90%的数据访问是只读的,一个好的数据缓存机制显然是一个不错的途径!但关于这个,我下次再谈。
所以我决定对他们的(Ajax和socket)速度进行测试,看看哪一个更快(至少在我的硬件和软件环境下)!我的硬件环境是:i5处理器,8GB内存和英特尔X25 SSD硬盘。
我要做的测试需要满足以下要求:
测试:
AJAX
Socket.IO 持续连接模式
Socket.IO 非持续链接模式
测试客户端与服务器之间进行10、100,、250、500条数据交换时的情况
在 release(非调试)模式下运行服务器
用Firefox作为客户端
最小化控制台消息输出,不管是服务器端还是客户端
在客户端页面硬性重新加载后进行每个测试
每次测试至少重复3次,以确保结果一致
我创建了一小型的小Node.js服务器,用它处理客户端请求:
io.sockets.on('connection',function (client) { client.on('send_me_data',function (idX) { client.emit('you_have_data',idx,random_String(4096)); }); });
这是我用于测试的JS客户端脚本:
var socket = io.connect(document.LOCATIOn.href); socket.on('you_have_data',function (idx,data) { var end_time = new Date(); @R_196_10586@l_time += end_time - start_time; logMsg(@R_196_10586@l_time + '(ms.) [' + idx + '] - Received ' + data.length + ' bytes.'); if (idx++ < countMaX) { setTimeout(function () { start_time = new Date(); socket.emit('send_me_data',idX); },500); } });
这次,对于每次数据交换,我都打开一个新的socket-io连接。
Node.js服务器代码与上一个类似,但是我决定在连接之后立即发送客户端数据,因为每次数据交换都会启动一个新的连接:
io.sockets.on('connection',function (client) { client.emit('you_have_data',random_String(4096)); });
客户端测试代码:
function exchange(idX) { var start_time = new Date(); var socket = io.connect(document.LOCATIOn.href,{'force new connection' : truE}); socket.on('you_have_data',function (data) { var end_time = new Date(); @R_196_10586@l_time += end_time - start_time; socket.removeAllListeners(); socket.disconnect(); logMsg(@R_196_10586@l_time + '(ms.) [' + idx + '] - Received ' + data.length + ' bytes.'); if (idx++ < countMaX) { setTimeout(function () { exchange(idX); },500); } }); }
最后是AJAX测试...
res.writeHead(200,{'Content-Type' : 'text/plain'}); res.end('_TESTCb(\'{"message": "' + random_String(4096) + '"}\')');
function exchange(idX) { var start_time = new Date(); $.ajax({ url : 'http://localhost:8080/',dataType : "jsonp",jsonpCallBACk : "_TESTCb",timeout : 300,success : function (data) { var end_time = new Date(); @R_196_10586@l_time += end_time - start_time; logMsg(@R_196_10586@l_time + '(ms.) [' + idx + '] - Received ' + data.length + ' bytes.'); if (idx++ < countMaX) { setTimeout(function () { exchange(idX); },500); } },error : function (jqXHR,textStatus,errorThrown) { alert('Error: ' + textStatus + " " + errorThrown); } }); }
记住,当将AJAX和Node.js一起编码时,你需要考虑到可能的跨域请求和同源策略,因此应该使用基于JSONP的格式!
我分别运行了10、100、250和500个数据交换的测试,这是最终测试结果:
Data exchanges | Socket.IO NON-persistent (ms.) | AJAX (ms.) | Socket.IO persistent (ms.) |
---|---|---|---|
10 | 90 | 40 | 32 |
100 | 900 | 320 | 340 |
250 | 2,400 | 800 | 830 |
500 | 4,900 | 1,500 | 1,600 |
看看结果,我们会注意一些情况:
对于每种类型的测试,结果遵循线性增长的规律,这很好——表明结果是一致的。
结果清楚地表明,当使用Socket.IO非持久性连接时,性能数字比其他数据差得多。
在AJAX和Socket.IO持久连接之间似乎并没有太大区别——我们只谈几毫秒的差异。 这意味着,如果您每天的数据交换次数不超过10,000次的话,用户基本上不会注意到速度差异...
下图描述了在测试中获得的数字:
那么接下来呢?
嗯,我必须弄清楚自己需要支持什么样的流量,然后我将重新运行这些测试,但这次不包括Socket.IO非持久连接。因为很明显,我需要在AJAX和持久的Socket.IO连接之间进行选择。
而且我也了解到,最有可能的是,速度差异不会像人们想象的那样大,至少不是为了一个“小流量”的网站,所以我在确定自己的解决方案时,还需要研究每个方法/技术的其他优缺点!
这里有一些资源,可以找到关于Node.js、Socket.IO 和 AJAX 的一些有趣的东西:
关注微信公众号:充实的脑洞, 一个技术宅的保留地 | |
---|---|
以上是大佬教程为你收集整理的【译】Node.js的速度困境:AJAX 和 Socket.IO到底选哪个?全部内容,希望文章能够帮你解决【译】Node.js的速度困境:AJAX 和 Socket.IO到底选哪个?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。