【问题标题】:Which is scalable? Simple CRUD Webapp vs Webapp talking to a REST service哪个是可扩展的?简单的 CRUD Web App 与与 REST 服务对话的 Web App
【发布时间】:2011-10-03 03:38:03
【问题描述】:

我认为标题说得很清楚。我不是可扩展性专家。我即将创建一个 Web 应用程序,该应用程序需要扩展到大型数据集和可能有许多(这里不会夸大其词,假设是数千个)并发用户。

MongoDB 是数据存储库,我在编写一个简单的Play! webapp 与MongoDB 对话与Play! 应用程序与一个 REST 服务应用程序(在 Scala 中)对话之间纠结,后者完成了所有业务的繁重工作逻辑和持久性。

我的一部分认为将业务逻辑包装为服务是面向未来的,并且允许仅在多个节点中部署 web 应用程序(扩展)。我来自 Java EE 堆栈和 Play!是 java web 框架中的叛逆者。这种方法向我保证,我可以远离 Play!如果需要。

我的一部分也认为 Play!应用程序 + Scala 服务应用程序更加复杂,从长远来看可能不会有成果。

欢迎提出任何建议。

注意:我是 Scala、MongoDB 和 Play! 的新手。如果我的问题很愚蠢,请原谅我。

【问题讨论】:

    标签: java scala scalability playframework


    【解决方案1】:

    可扩展性是一门工程艺术。这意味着您有很多参数,并将您的经验应用于这些参数的特定值以得出解决方案。因此,如果没有关于您的问题的更具体数据,一般建议很难。

    话虽如此,根据经验,一些一般性建议:

    • 让您的应用程序尽可能简洁明了。这使您可以保持选择开放。在您的情况下,从一个简单的 Play 应用开始。专注于干净的代码,这样您就可以轻松地将您拥有的东西重新加工成不同的架构模型(使用干净的代码,这比您想象的要简单:-))
    • 测量而不是猜测瓶颈在哪里。用请求淹没服务器很简单。使用分析、内存转储等方法来查明可扩展性的瓶颈。

    只有到那时,有了可用的应用程序(您可以提早启动)和有关您的扩展瓶颈所在的数据,您才能决定在(水平可扩展的)服务中拆分哪些内容。

    一开始,服务看起来不错且可扩展,但它们经常让您陷入早期混乱 - 服务需要相互通信,因此您开始引入消息传递等。保持简单、衡量、优化。

    【讨论】:

    • 我同意服务层增加了一点复杂性,但我不完全同意的是,这个层可以在以后根据需要添加。但谢谢你的提示。简单是要走的路。
    • 相信我——你可以。干净的代码将具有自然的内部接口,并且将它们远程处理到服务中通常很容易。干净的代码永远是赢家:)
    【解决方案2】:

    这个问题看起来并不傻。对我来说,将您的数据访问封装在其余层后面并不会直接提高应用程序的可扩展性。(当然,重要的是,有服务器可以执行 http 缓存和处理请求队列等。但是从您的描述来看,您的应用程序看起来足够小)。您可以在没有 Rest 层的情况下实现类似的可扩展性。但话虽如此,服务层可能会产生间接影响。

    首先它使您的应用程序更干净。 (与 db 对话的 UI 很混乱。)。它有助于使应用程序可维护。 (多折)。休息层可以为您提供应用程序中可能需要的中间层。此外,正确设计的 Rest Layer 必须是 Resource Driven 。以我的经验,资源驱动架构是易于实现和高度可扩展设计之间的良好中间地带。

    所以我强烈建议您使用服务层(Rest 是要走的路 :)),但可扩展性本身并不能证明该决定的合理性。

    【讨论】:

    • 如果我错了,请纠正我,我应该添加服务层以保持代码清洁而不是添加它以进行缩放。这是对您答案的正确解释吗?
    • 可扩展性不应是添加服务层的主要原因。还有其他更令人信服的理由。添加层将有助于扩展性,但考虑到应用程序的规模,我认为改进不会很显着。
    【解决方案3】:

    把服务放在 UI 和数据源之间,封装了数据源,所以 UI 不需要知道数据是如何被持久化的细节。它还可以防止 UI 直接进入数据源。这允许服务根据需要进行身份验证、授权、验证、绑定和执行业务逻辑。

    缺点是应用程序会出现轻微的减速。

    我想说的是,添加服务成本低,好处大。我会投票赞成。

    【讨论】:

    • +1 表示一般建议。您能否也描述一下对可扩展性的影响。我的回答主要基于应用程序的规模,但我想听听其他意见。
    • 添加服务层是否有助于扩展?意思是,一个服务应用程序和多个 webapp 实例,这种架构在现实世界中是否普遍存在>
    【解决方案4】:

    像往常一样,答案是。这取决于。 如果涉及一些繁重的工作和一些业务逻辑:是的,最好将其放在自己的层中,如果您向其添加 RESTful 接口,您可以将其提供给您想要的任何前端技术。

    如今,人们通常不会为拥有单独的 Web 应用层而烦恼,而是通过 AJAX 将数据直接提供给客户端。

    如果您需要维护大量用户会话状态或有机会在表示层上缓存数据,您可能会考虑添加一个层。您需要表示层的原因还有很多,例如,为不同的设备/客户端提供不同的表示。

    不过,不要只是为了复杂而添加层。

    我可能会补充一点,您应该尝试使用 HATEOAS 原则。在横向扩展解决方案时,这将大大简化事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 2014-11-29
      • 2010-11-04
      相关资源
      最近更新 更多