Scala 中间件选择之间有啥区别?

Posted

技术标签:

【中文标题】Scala 中间件选择之间有啥区别?【英文标题】:What are the differences between Scala middleware choices?Scala 中间件选择之间有什么区别? 【发布时间】:2012-02-09 12:11:44 【问题描述】:

注意: 很遗憾,这个问题已关闭,但我正在努力维护它,以防其他人提出同样的问题。

我一直在寻找一个很好的解决方案来在 Scala 中开发一种介于移动设备和现有网络服务之间的服务。

当前可行的选项列表是:

Finagle Spray BlueEyes Akka Play2 Mini Unfiltered Lift Smoke Scalatra

可能还有更多选择。一个人如何决定使用哪一个?一个好的 Scala 中间件选择的特点是什么(请原谅双关语;-)。一方面,我想选择 Akka,因为它是 TypeSafe Scala 堆栈的一部分,但另一方面,像 Finagle 这样的东西具有丰富的库集,并且使管道变得如此简单。喷雾看起来不错,使用简单。

我们将不胜感激任何建议、见解或经验。我敢肯定,有些人一定对其中一些有一些经验,他们不会介意分享。

更新:

我希望重新提出这个问题。对这个问题的一个好的回答将有助于新的 Scalateers 避免相关的陷阱。

更新 2:

这些是我提出这个问题后的亲身经历:

Finagle - 我在一个项目中使用了 Finagle,它坚如磐石。

Spray - 在我的最新项目中,我正在使用 Spray,我非常高兴。最新版本是基于 Akka 2 构建的,您可以直接使用 Spray-can 库运行它,从而无需 Web 服务器。 Spray 是一组库,而不是一个框架,并且非常模块化。 Learn about Spray: REST on Akka video 提供了一个很好的概述,this blog at Cakesolutions 展示了一个非常好的开发方法和架构。

更新 3:

生活节奏很快。如果你不时不时停下来看看周围,你可能会错过它。 - 摩天轮

这些天来,选择变得更简单了。在我看来,Spray 赢得了这场战斗。 integrated into Akka 将成为下一个 Akka HTTP。我现在已经在多个项目中使用 Spray,老实说,它是我遇到过的最棒的软件。

这并没有回答最初的问题,但至少说明了为什么在大多数情况下 Spray 似乎是最佳选择。它非常灵活、无阻塞且非常稳定。它有客户端和服务器端的库和一个很棒的测试工具包。另外,请查看这些统计数据以了解性能:Web Framework Benchmarks

【问题讨论】:

感谢您添加 finagle @ErnestFriedman-Hill。如果可以,我很乐意为您解释为什么用户将此问题标记为不具建设性。我还没有在生产中使用过上述任何系统,我花了一周的时间来审查它们和其他系统,并且希望对其他体验有见解。 基本上是因为 *** 不是为讨论问题而设计的。一个好的 SO 问题有一个具体的、可验证的答案,一个不可辩论的答案。你的问题是一个非常受人尊敬的问题,但这不是 SO 想要看到的。以下是常见问题解答中的三个示例,您应该在这里问:“您最喜欢的______是什么?” “我用______代表______,你用什么?” “我很好奇其他人是否和我一样。”您的问题似乎是这三个反例的混合体。 @ErnestFriedman-Hill 我可能错了,但也许这是一个可以验证答案的问题。当我问这个问题时,我最终使用了 Finagle。该项目结束得很好,并且像发条一样运行,但我仍然想知道基于 Akka 的服务是否会更好。我仍然不知道答案,真的希望你们能考虑重新打开它。 一个关于如何使这样的问题有点有效的提示,问:“这些框架之间有什么区别?” 【参考方案1】:

我个人很久以前就开始使用 spray,并尝试了 Scala 的所有其他功能。虽然 Scala、spray、akka、shapeless 和 scalaz 肯定有一些学习曲线,但一旦你开始深入研究并真正学习应该如何使用这些技术,它们就很有意义,我立即看到了这些技术的好处我现在正在做的工作。

就我个人而言,我认为在构建服务器、rest api、http 客户端以及您想要的任何其他东西时,没有什么能真正经得起喷。我喜欢喷雾的原因是他们在构建时考虑到了 akka。当我第一次开始使用它时,它可能是一个非常早期的项目,但架构是有意义的。这些人知道他们在利用使用 Actor 模型的好处和没有任何阻塞操作方面做了什么。

虽然演员可能需要一点时间来适应,但我确实喜欢他们。它们使我的系统非常可扩展且运行成本低廉,因为我不需要像过去那样强大的硬件。另外,spray 具有喷雾路由 DSL,因此只要您遵守规则,制作一个 rest api 就相对简单......不要阻塞。这当然意味着不要去拉入 apache commons http 客户端来从 api 或 actor 发出客户端请求,因为您将回到阻塞模型。

到目前为止,我对 spray、typesafe 和 akka 感到非常满意。他们的模型很自然地适用于构建非常有弹性的系统,如果发生任何事情并且您采取快速失败的方法,这些系统会自行恢复。我对 Spray 的不满(这不是 Spray 的错)是该死的 IDE 对路由 DSL 的支持。我绝对鄙视Eclipse,一直是IDEA用户。当我开始使用 Scala 插件时,一切似乎都很好。然后我的路由 dsl 自然演变成更大的野兽。 IDEA 解析该代码的方式使其在遇到任何带有喷雾路由或无形的东西时都会大吃一惊。到了无法使用的地步(我输入了 2-3 个字母,并且必须等待 5 分钟才能重新获得控制权)。

因此,对于任何喷射路由或繁重的无形代码,我使用 ensime、ensime-sbt 和 scala-mode2 启动 emacs。现在,如果我只能获得一个具有 astyanax 质量的 Cassandra 库,并使用更非阻塞的架构构建。

【讨论】:

这是一个旧答案。你得到那个 Cassandra 库了吗?【参考方案2】:

Here 你可以找到一份很棒的 scala 资源列表,其中包含你列出的所有替代方案的简要说明。

根据我自己的经验,我使用 Scalatra,它小巧、简单且有效,可用于 uri 映射和调用 Web 服务。

【讨论】:

以上是关于Scala 中间件选择之间有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

API、框架和中间件有啥区别? [关闭]

控制器和中间件有啥区别

文档中间件、模型中间件、聚合中间件、查询中间件有啥区别?

文档中间件、模型中间件、聚合中间件、查询中间件有啥区别?

List和List之间有啥区别

Connect/Express 中的“session”和“cookieSession”中间件有啥区别?