Java后端和Rails前端

11

我有一个创业公司正在考虑构建Java后端和Rails前端。 Java后端将负责为数据库创建缓存层并提供其他附加服务。 Rails前端主要用于创建Web应用和监控工具。

有哪些创业公司正在使用这种设置? 在开发速度,部署,可扩展性和集成方面有哪些需要注意的地方?

(对我有帮助的是个人经验或非正式案例研究。我想将回答关注于替代品,如Grails或JRuby除非它是方程式的重要组成部分)

谢谢!


在后端,你会期望有什么内容?前端应该如何与后端通信呢? - Thorbjørn Ravn Andersen
@Thorbjorn:就通信而言,我倾向于使用JSON。但我还没有确定要使用哪个库或伴随而来的维护等权衡。你有什么想法吗? - Ian
Twitter正在这样做。他们的前端是Rails,后端使用Scala。我认为你正在做正确的事情:用正确的工具做正确的工作。 - Joshua Partogi
1
听起来很有趣,你在招聘吗? :) - willcodejavaforfood
@Ian 最终你做出了什么决定? - sandeepkunkunuru
6个回答

6

我从未进行过Rails开发,但以下是我的想法。为什么不使用Grails呢?我做过相当数量的Grails开发,它非常适合快速原型开发。它还提供了所有Java、Spring和Hibernate的强大功能。不必处理两种不同技术之间的通信,您可以利用Grails在后台使用Spring和Hibernate处理缓存以及任何其他这些技术支持的要求的事实。如果您有Java开发人员,那么Grails应该很容易上手。Grails插件库运作良好。所有插件都存储在一个中央位置,易于获取,但是质量取决于插件作者。您还需要记住,由于Grails使用Groovy,它在语法上类似于Java并且在JVM上运行,因此很容易使用现有的Java代码,包括可用的Java库。虽然我不能确定,但我认为有很多库可供Java和Grails使用,而Ruby语言和Rails可用的库可能会更少。我无法为您提供资源使用情况建议,但我的问题是:有多少人具有设计使用Java作为后端的Rails系统的经验,以及与此相关的所有陷阱?您可能会发现,在两种技术之间出现通信故障时,没有人能熟练地进行调试。


Grails作为一种替代方案绝对是有意义的。对我来说,这更多是一个人力资源的问题。我们有一些Java专家和一些Rails专家。使用Grails会导致双方都需要提高技能水平。至少在任何一方,有些人会知道一些小问题,而不是每个人都处于新领域。解决方案非常合理。只是我还没有说服自己做出这种权衡。你有什么想法? - Ian
另一个方面,我还没有足够的经验来判断 Grails 插件/宝石支持。大概有多少在 Rails 中可以找到的插件/宝石也能在 Grails 中找到呢?当然,这只是个粗略的说法。 - Ian
@lan,Rails插件中有多少百分比仍然与最新版本的Rails兼容?几乎没有... - Kedare
@Kedare:已经注意到了。我个人在http://www.railsplugins.org/plugins上并没有遇到太多麻烦。但是,你对Grails插件有什么补充吗? - Ian
我已经更新了我的答案,并回答了你的问题,因为它太长了,无法适应评论。 - Jared

4

我曾在一个项目中使用过类似的组合,但我使用的是Python而不是RoR。我认为两者之间没有太大的区别。

一般来说,在这种编程中并没有什么特别的。你必须关心两件最重要的事情:

  • 良好的模块化;
  • RoR和Java之间周密考虑的协议。

第一点是关于系统各部分之间确切功能分解的问题。由于不理解哪些工作必须由Java完成,哪些工作必须由Python完成,我们遇到了一些麻烦。总的来说,你必须将所有相互关联的函数绑定在一起,而远离的东西必须在很少的地方连接。我猜你知道良好模块化的规则,但在组合不同语言的情况下,这必须更加周密考虑。你也可以考虑创建几个不同的Java服务(例如一个用于数据库缓存,另一个用于其他所有内容),以便能够自由组合它们甚至在以后的项目中使用。

第二个问题是关于部件之间的通信。我可以看到两种通信方式:通过数据库和通过纯网络协议。前者需要一些网络通信,因此我们使用了纯网络协议,没有其他连接部件的方式。
我们曾经尝试过SOAP,但它出现了数百个错误:这种协议连接同一语言编写的服务(例如Java与Java)相当不错,但连接不同语言编写的服务时则很糟糕——自动生成WSDL的工具为Java和Python给出了不同的结果,手动创建方案也很困难和费时。
所以我们使用了REST。它使用HTTP协议的所有特性,如四种主要HTTP方法(POST、GET、PUT、DELETE)、错误代码和许多其他内容,因此几乎覆盖了您可能需要的所有内容。 REST唯一的限制是它无法保持状态,因此您可能需要实现自己的会话机制。
如果您对REST不太熟悉并且需要一些真实的示例,请查看Facebook Graph API,如果要在Java中实现REST服务,则可以使用Restlets

关于模块化和通信的评论很好,谢谢。您是否有意识地选择使用REST而不是JSON替代方案?如果是这样,您的思路是什么? - Ian
你是说为什么我们使用REST而不是JSON吗?我们没有。REST只是一种架构,您可以使用任何表示来传输数据。我们必须使用XML(我们需要使我们的服务可用于另一个开发团队),但通常最好使用以JSON为主要表示的REST模型。例如,要使用DB中的“Foo”表,请将URL设置为“/foo/<foo-id>”,使用方法“PUT”添加新的“Foo”实例,“POST”更新,“DELETE”删除和“GET”检索 - 这就是REST。所有这些URL的实际数据都可以表示为JSON字符串。阅读有关REST的一些信息;) - ffriend
再次提到,看看Facebook Graph API - 他们使用REST架构和JSON表示的对象。 - ffriend

2
也许我说的很明显,但最大的问题在于你要将两种技术结合起来。开发速度不仅会变慢——Rails 和所有 Java 框架都期望拥有完整的 Ruby/Java 应用程序——而且对于你提到的其他问题(部署、可扩展性、集成),现有的工具和解决方案将无法正常运行,或者至少不能很好地运行。
如果你有充分的理由将这两种技术结合起来,那就去做吧,但要预计在这些问题上花费比单一技术方案更多的时间。如果没有特别的理由,就选择 Rails 或 Java 中的一个。

1
可能很明显,但额外强调确实有帮助,谢谢。我的想法是每种语言可能比另一种更擅长某些任务。例如,至少在个人看来,Rails在原型设计Web应用程序方面要快得多。我如何量化/评估这种时间上的权衡,即在那里获得的时间与部署、可扩展性和集成所失去的时间之间的权衡。 - Ian
@Jeroen:我不同意你的说法。这是一个架构决策。我不能说Rails,但Java框架并不期望一个完整的Java应用程序。这完全是我们现在看到的相反情况。没有万能药,我们需要选择最好解决每个问题的技术。如果您正在构建一个巨大的SOA应用程序,这种明确的关注点分离可能是正确的选择(例如Twitter)。 - Trein

2
我强烈建议您考虑将前端和后端放在同一个JVM中,以提高性能。
对于Rails来说,JRuby可以运行Rails,并且您可以将其放在Java EE容器中,提供组件之间的快速通信。
如果有多个不在同一进程中运行的架构,则需要进行基于网络的通信,这比只是传递对象引用要花费更长的时间(我不认为您想使用共享内存)。

通信及其相关的性能影响绝对是决策中的重要因素。我如何评估/量化这种性能影响?Web应用程序已经有了像memcached和solr之类的网络调用。在那里的性能影响对我来说并不明显。对于调用其他Java服务,情况会有所不同吗? - Ian
就JRUBY而言,从文档上看,我发现它与Spring 3的集成并不太顺畅。此外,像JRuby插件这样的社区支持还没有得到充分发展。虽然我无法量化,但只是一种感觉。你有相关经验吗? - Ian
每次从数据库中选择数据时,都会进行网络通信,请考虑一下。是的,这比传递引用要慢,但并不是非常重要。 - ffriend
@Andrei,这取决于具体的实现方式。例如,Embedder Derby不需要网络即可执行JDBC。 - Thorbjørn Ravn Andersen
一般来说,它是快速的,并且足以处理大多数Web应用程序。此外,我进行了一些基准测试。结果:从MySQL数据库中简单选择100条记录-约40毫秒,递归阶乘(1000)-约8毫秒,对本地主机的网络请求-约1.2毫秒(Jetty Web服务器,不是最快的),对google.com的网络请求-约0.3毫秒。想一想。 - ffriend

1
我们在前端使用了Ruby on Rails,在后端使用了Core-Java SOAP Api。它运行得非常好。
主要问题不在于性能,而在于人员。很难为每个方面雇用Ruby on Rails的专家人才,相反,您可以雇用少数人或者很容易地将他们塑造成学习Rails UI。
从创业公司的角度来看,这是最佳策略。许多人认为ROR是创业公司的最佳选择...但很少有人知道,因为在大多数跨国公司中,我们使用Java,所以有压力去学习Rails和编码,或者只雇用少数ROR开发人员。因此,您可以仅在前端使用ROR(只有少数人这样做,或者很容易学习),并使用经验丰富的Java开发人员进行数据库更新和业务逻辑。

1

据说Twitter.com使用Java后端和Rails作为其Web界面。以下是一些资源:

http://www.radicalbehavior.com/5-question-interview-with-twitter-developer-alex-payne/

http://blog.adsdevshop.com/2008/05/02/twitter-is-not-abandoning-rails/

http://twitter.com/#!/ev/status/801530348

更具体地说,他们在后端使用Scala(它编译成Java字节码):

http://www.artima.com/scalazine/articles/twitter_on_scala.html

我认为这种方法没有任何问题。但是,您将支持两个不同的平台/虚拟机。我曾经看到过这种情况导致组织内专业知识的一种分裂。最终你会花费很多钱来拥有两套专业知识。

如果担心专业知识的分割问题,我建议使用JRuby或Rails。它现在非常成熟,并且比Ruby 1.8.x上的Rails运行得更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接