南京专业网站开发团队,wordpress如何构建页面,想建网站须要什么条件,郴州网课Ciaran是Skimlinks项目团队中的一名领导者#xff0c;热爱开发#xff0c;在业余时间喜欢研究一门新语言。作者和他的团队在开发Skimlinks项目时遇到了一些困难#xff0c;于是做了这份测试#xff0c;文中将Node.js、Scala、Go、Python、PHP进行对比#xff0c;最终Pytho…Ciaran是Skimlinks项目团队中的一名领导者热爱开发在业余时间喜欢研究一门新语言。作者和他的团队在开发Skimlinks项目时遇到了一些困难于是做了这份测试文中将Node.js、Scala、Go、Python、PHP进行对比最终Python获胜目的的是为了让开发者为stack挑选最好的开发技术。
在过去的这段时间里我之所以杳无音讯是因为作为这个项目的领头人我正从事一项有趣的项目我们将其命名为“Skimlinks”。
我的大部分工作是从事后端引擎开发和支持SkimWords产品进程通过一些非常完美的高科技进行识别和添加代销商网络产品链接从而让网站主获取利润。这是一种新颖的线上广告模式相比于页面上的大幅banners图我更喜欢这种新颖的模式我们正在尝试为用户添加有价值的信息如产品价格比较、添加链接让用户可直接购买想要的产品。
开发环境
大部分前端开发是用PHP编写的当公司需要快速、灵活开发项目时选择PHP是个不错的选择。但是随着公司既定产品的知名度不断提高以及搜索的高并发访量PHP正日益成为我们发展的一个瓶颈。
存在问题
使用Apache多选程模块(MPM)apache会阻碍大量的搜索请求当出现高并发访量时页面无法响应。
这里有一个快速的方法可提高服务器的吞吐量增加工作进程然而当RAM快要耗尽时将会受到限制。每个进程都有独立的RAM数据块增长和搜索取决于PHP在哪个点上当没有足够的空间释放时你必须将OOMing关闭它可以迅速的将吞吐量降至为0。
最可行的扩大规模的方法就是把项目管理模块从Apache prefork MPM换成更出色、更快速的Apache worker MPM。通过改变多进程大大增加了服务器请求数唯一的缺陷只是为了这个工作而工作PHP必须能够保证处理多个并发线程不会产生死机然而事实并非如此。PHP的核心是多线程因此我门认为它可能是因为某些驱动或者延长使用而导致失败然而无论出于什么原因PHP不在符合我们的需求。
为此引发了我们会选择哪种语言进行开发而争论不休每个人都在推崇他们喜欢的语言有人赞成、有人反对。很明显众口难调没有一个衡量标准是很难选出来的因此我们决定用各个语言来测试一个系统看它们的执行情况在做定夺。
参赛语言
基本规则是如果你想要某语言进行测试必须愿意提供执行API请求数最后推选出
Node.js流行程度依然高涨它的目标是帮助程序员构建高度可伸缩的应用程序编写能够处理数万条同时连接到一个只有一个物理机的连接代码。 Scala (w/ Tomcat)我非常热爱JVM起初我也推荐过该语言但因为它过于冗长而被否决令人兴奋的是这次Scala得到了大家的认可。Python (w/ Tornado)我们已经有Python方面的经验。Go (golang)我对这门语言感兴趣而我的同伴们却认为这门语言不好建议使用Java。我还建议使用C#和.NET/mono但因为不公平性最后都被否定了。
挑战
我们选择了一个非常简单的日志API系统所做的这些是为了从JSON请求数中抓取详细信息采用MD5用于确保信息传输完整一致。主流编程语言普遍都用MD5实现。将数据如汉字运算为另一固定长度值是杂凑算法的基础原理每个执行阶段都将使用Apache BenchmarkApache附带的一个小工具专门用于HTTP Server的benchmark testing可以同时模拟多个并发请求来评估各种语言开发并发水平速度。
当Node.js和Python Tornado以单一线程运行时使用Nginx一个高性能的HTTP和反向代理服务器也是一个IMAP/POP3/SMTP代理服务器 来查看这两个实例。
针对Scala我甚至特意编写一份old-school Servlet(一种服务器端的Java应用程序具有独立于平台和协议的特性可以生成动态的Web页面它担当客户请求Web浏览器或其他HTTP客户程序与服务器响应的中间层)在基于tomcat下运行。
采用AWSAsp Web Server是一款基于netbox开发的asp web服务器其个小功能强大基本上能够取代IIS成为广大Asp程序员和网站开发者的利器直接在服务器上执行基准以消除任何一个网络瓶颈。
通过mongo删除每次测试数据每次测试至少执行3次选取平均值以确保有足够的“热身”时间和消除任何异常结果。
通过在多个并发值下进行测试(10501002005001000)一起来看下在高负荷的情况下性能发生了什么变化。
测试结果
每秒请求数这个测试给了我们一个实现纯速度的想法最明显的一点越高越好。 有一点值得我很欣慰Scala独占鳌头。PHP正如预期所想的那样受多线程的限制香消玉损。另一个让我震撼的是Go语言当并发访量不断增加时它以平缓的速度迅速下滑最终也Over了。如期所料两个单线程non-blocking solutionsnode和 python性能差不多python要比Node稍微好点。
响应时间
尽管每秒请求数进程的吞吐量呈现出一个好的迹象但是同样重要的是在高负荷的情况下表现很糟糕。由图表得知在一段时间内完成的请求数比例越低越好。
100并发请求数: 在这里我们看到Scala需要的时间最少而其他几门语言之间没有太大区别。
200并发请求数 图中我们看到有趣的现象以9秒速度来计算请求数Go和PHP都有受到影响花费的时间比较多。
500并发请求数: 在500并发需求时使用9—14秒完成请求。PHP无法响应Go语言花费时间较多占最高值。
1000并发需求数 当我们遇到数以千计的请求数时 Go语言Over了通过测试根据apache规则要求超过50%的失败率就算出局。如图所示Node和Python依然存在可以清楚的看到其性能特性。但是Python比Node要更好一点。但在第一幅图上Python表现的要稍微差一点。
通过测试能清楚的分辨出各语言的性能表现以上测试的这些数据是我们APIs中的一部分因此对我们来说非常重要。
Scala表现的很好几乎很完美我把它归功于在连接池的Mongo数据库中单独接入MessageDigests和快速进行JSON分析程序。我不确定Go语言到底是怎么了也许是我使用的Mongo驱动的问题但无论是什么原因看到它这么差的表现真的让我很难过。
最后决定
最终我们经过讨论决定选择PythonScala如此之快我们为什么不选择Scala而另选Python呢原因如下
Scala这门语言很难我需要很久才能将简单的API整合在一起才能进行工作python阅读起来就像haiku而Scala阅读就像蛇类游戏一样。
线性编程是很痛苦的对Scala来说很容易也很安全简单的单线程non-blocking解决方案总是很吸引人但我们应该不断的去尝试挑战。
整个团队在Python上有着丰富的经验如果让大家去接受一门新的语言尤其像Scala这样的既昂贵又费时间。
此前网络速度、数据库查询等API成为我们发展的一个瓶颈而今我们已经找到正确的解决方案——Python我们只需等待执行和发布希望这个决定是正确的。
英文出自skimlinks