【问题标题】:Advice on communication between rails front-end and scala backend关于 Rails 前端和 Scala 后端之间通信的建议
【发布时间】:2012-04-19 09:04:02
【问题描述】:

我们正在开发以下设置:

Rails Web 应用程序允许用户对传递给 Scala 后端的任务发出请求以完成,这可能需要 10 秒或更长时间。发生这种情况时,用户用于发出请求的页面会定期使用 AJAX 轮询 rails 以查看任务是否完成,如果完成则返回结果。

从用户的角度来看,请求是同步的,除了他们的浏览器没有冻结而且他们得到了一个很好的旋转的东西。

后端需要的输入数据量大,结构复杂,输出也是如此。我最初的计划是简单地让两个应用程序共享同一个数据库(将是 MongoDB),因此 rails 应用程序可以简单地将一个 id 写入一个“作业”表,该表将由作为守护进程运行的 scala 后端拾取,但我越想越担心这种方法可能有很多潜在的陷阱。

最让我担心的两件事是模型代码的重复,使用两种不同的语言,需要保持同步,以及在部署时处理这个增加的复杂性。在评估这种方法时,我还应该考虑哪些其他可能的问题?

我正在研究的其他一些可能性是 1) 使 Scala 后端成为 RESTful 服务或 2) 实现消息队列。但是,我并不完全相信这两种选择,因为它们都需要更多的开发工作,而且在我看来,在这两种情况下,模型代码无论如何都会被有效地复制,无论是作为 RESTful API 的一部分还是作为消息的消息队列 - 我错了吗?如果其中一个选项更好,有什么好的方法可以解决它?

【问题讨论】:

  • Scala RESTful 服务是 imo 的必经之路。至少在成功的项目中,完全相同的问题是这样解决的。
  • 您能否举一些例子并在答案中解释原因?
  • 您是否考虑过使用 JRuby 并为模型代码使用一些通用库?
  • 我过去曾尝试过 JRuby,但当时没有出色的结果 - 我现在不记得为什么了 - 是否有各种 gem 不能在 JRuby 中工作?
  • 对于为什么有人对此投反对票,我感到非常困惑。需要解释一下吗?

标签: ruby-on-rails scala rest message-queue backend


【解决方案1】:

我曾多次使用resque 解决类似的问题,我一直对它非常满意,它为您提供了实现作业队列所需的一切,并支持redis。我强烈建议你看看它

【讨论】:

  • 我认为它期望后端也在 Ruby 中是错误的吗?不幸的是,Ruby 对于我需要做的事情来说太慢了。
  • 你可以随心所欲地实现后端,你唯一需要做的就是消费队列,我已经在 J​​ave 中完成了它,而且非常简单。如果你使用 Ruby 后端,当然会更简单,但不是强制性的
  • 事实上,这里有一个为 scala 实现的工作者:github.com/jamesgolick/scala-resque-worker。所以不需要额外的工作
  • 太好了,谢谢。这是否解决了需要共享数据库的问题?输入和输出数据集可能太大且结构复杂,无法用作作业对象。
  • 您能否详细说明数据有多大?在我看来,使用大数据作为参数比使用共享数据库存储这些参数会遇到更多问题。此外,redis 有一个完整的机制来序列化对象以将它们用作作业的参数
【解决方案2】:

不要误会我的意思,但是,对于这个项目,Rails 提供了哪些 Scala 没有的功能?

换一种说法,你能完全不用 Scala 而全部用 Rails 来做吗?显然是的,但是您在 Scala 中开发后端是有原因的,对吧?现在,Scala 提供了什么 Rails 没有?

我并不是说你应该做其中一个,但维护重复代码是自找麻烦/复杂化。

如果您已经在项目中投入了大量的 Ruby 代码,那么您将致力于 Rails,除非进行彻底的 Twitter 式大修(听起来既不是一个选择,也不是所希望的)。

无论如何,不​​确定您将如何解决模型重复问题。使用 Mongo 后端确实可以为您购买 BSON 结果集,您可以将其与 Spray 结合使用,它们是 Akka 的出色实现、开箱即用的 REST 和 JSON 实用程序。

棘手的问题,听起来你陷入了两种范式之间!

【讨论】:

  • 在前端坚持使用 Rails 的决定是由于学习其中一个 scala 框架的开销,因为我们没有任何经验。我不排除它,但到目前为止已经花了几个小时尝试并未能获得香草游戏!应用程序运行(使用类型安全堆栈)我倾向于认为它不会像 Rails 那样简单。
  • 您能否详细介绍一下如何构建全 Scala 解决方案?
  • 来自 Rails,Scalatra 将是迄今为止最容易使用的(当然,它是 Sinatra 的克隆)。你得到开箱即用的路由,很容易将路由抽象成一个基类,然后在扩展控制器中让路由调用 Rails 风格的 show、list、index 等方法。扩展模板引擎(带有coffeescripted-sbt 和less-sbt 插件)并开始比赛;-) 玩! 2.0 得到了褒贬不一的评价,我暂时离开,我不想要厨房水槽,给我核心组件,我会做 REST
  • 但是 Spray 对于即发即弃的 Akka Actors 方法来说是一个很棒的项目。比 Scalatra 更难理解,但对于无状态 REST,也许是最好的 Scala 环境(是的,还有 BlueEyes 和 Unfiltered)
  • 谢谢。因此,为了避免疑问,您是在谈论在 scala 中仍然有两个应用程序,在这种情况下它们如何通信,或者您是否建议在 scala 中拥有一个同时运行后台作业的应用程序?
猜你喜欢
  • 2017-12-23
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 2017-11-22
  • 2014-07-20
  • 1970-01-01
相关资源
最近更新 更多