编写Web服务的推荐语言

时间:2010-01-24 06:44:20

标签: java web-services programming-languages concurrency

我是一名开源开发人员,我需要编写一个高度可扩展的Web服务。由于各种原因(基本上对并发性的支持很差),我使用Ruby on Rails作为我的应用程序前端而不是后端(阅读:http://www.ddj.com/go-parallel/article/showArticle.jhtml?articleID=212903282)。我的Web服务需要为每个请求调用几个合作伙伴API,因此需要聪明地了解线程以获得高吞吐量。

社区建议使用哪种语言/堆栈来编写此类Web服务?我有一段时间没有写过Java(而且看起来真的是老派:D)。我需要能够快速对这项服务进行原型设计。

6 个答案:

答案 0 :(得分:4)

  

社区建议使用哪种语言/堆栈来编写此类Web服务?我有一段时间没有写过Java(而且看起来真的是老派:D)。我需要能够快速对这项服务进行原型设计。

然后我肯定会建议使用Java和JAX-WS API,它和其他Java EE 5 API一样,是基于注释的,以简化开发。换句话说,你注释了一个Java类并且vo,你已经完成并可以将其部署为Web服务。这对于原型设计来说非常完美(即使我稍后会改用契约优先方法)。对于此API的实现,您可以使用Java 6中包含的引用实现(JAX-WS RI)(自Java 6u4开始),也可以在Metro中使用,即GlassFish的Web服务堆栈(Metro = JAX-WS RI) + WSIT)。另一个(非常好的)堆栈也实现了JAX-WS Apache CXF

如果您想了解一些有关JAX-WS RI性能的数据,请查看this benchmark,它会让您了解其功能(和/或您需要的硬件)。< / p>

要了解此API的外观,请查看Introducing JAX-WS 2.0 With the Java SE 6 Platform, Part 1Introducing JAX-WS 2.0 With the Java SE 6 Platform, Part 2(虽然复杂性可能无法代表现实生活)。

更新:我已经提到了JAX-WS RI,Metro,Apache CXF,如果你告诉我这是令人困惑的,我会理解的。问题是,如果你谷歌的JAX-WS,你将满足所有这些条款/首字母缩略词。所以我试着给出最小的信息来澄清它们是什么。如果您需要任何澄清或更多细节,请告诉我。

答案 1 :(得分:2)

一个鲜为人知但很好的选择是C ++。有许多框架,从高级AJAX抽象(Wt:http://webtoolkit.eu/)到简单的CGI库(例如http://cgi.sourceforge.net/)。性能非常好,否则开发速度很快,但是一直需要重新编译可能会妨碍您的开发。需要考虑的另一个问题是现成的webdev库和API数量较少,但我找到了所需的一切(例如SOCI,LibXML ++和Boost.ASIO)。

C#和Java也是高性能选项,但它们中的开发可能比C ++慢,主要取决于您使用的内容。另一方面,您可以获得大量的库和支持。

虽然大多数脚本语言(最着名的是Python和Ruby)由于使用全局解释器锁而缺乏对多线程的适当支持,但这对于Web服务来说并不是真正的问题。可以通过为每个用户运行单独的进程来解决该问题。这有一些更大的内存要求,但总的来说它运行良好,它肯定更安全。

Python和Ruby的一个更大问题是它们执行代码的速度非常慢。为了使问题更严重,与其他Ruby库相比,Rails是一个非常慢的框架。我已经使用Ruby(使用Ramaze Web框架)成功创建了高负载Web服务。为了达到可接受的性能水平,需要在源代码级别进行手动优化,但是对于我的工作已经足够了,我们可以继续使用Ruby。

答案 2 :(得分:1)

如果您选择继续使用Java路径,那么我建议使用jax-ws(Metro实现,默认情况下已包含在Java 6中)有两个原因:

  • 比其他选择更简单,更直观。
  • 它更快,你提到性能很重要。请参阅here最近一篇关于效果的文章。

答案 3 :(得分:0)

快速原型:

  • Python(像Ruby一样编写lauange,可以帮助你快速学习)
  • 或JSP,因为你以前学过Java。

答案 4 :(得分:0)

这取决于您的其他要求。

例如,如果您想使用.NET,那么您可能希望将F#用于后端。如果你使用

  

专家F#

作者将展示如何在网页中使用F#。

如果你想使用类似Java的东西,那么可以选择Scala作为选项。

或者,如果你想要非常可扩展,那么,如果你添加新机器,你不必更改任何代码,那么你可以看看Erlang。

您可以使用线程来使用OOP语言,但它不会那么高效,因为测试和设置锁定方式可能没有达到预期效率。

答案 5 :(得分:0)

为此生成Ruby进程没有任何问题。只要您将它们设计为独立(彼此之间以及从数据库中),您的可伸缩性就可以了。您可以使用与其他语言和环境相同的硬件获得更高的性能,但在开源项目中引入新语言是一个很大的禁忌。它基本上会减少可用开发人员的数量。