摘要:在开发可扩展的应用程序时,在SQL数据库和NoSQL数据库之间进行选择通常很繁琐。另一方面,当将状态存储在Web应用程序中是一个好主意时,可能会有一些用例。

当初创企业的Web应用程序的用户数量成倍增长时,他们将面临极大的不确定性和挑战。他们需要灵活选择,例如除了建立合适的团队之外,还选择合适的框架,数据库和体系结构。而且,与企业不同,初创企业只有有限的时间进行扩展。更糟糕的是,如果他们足够幸运,则可能需要在几个月内将容量扩展十倍。

为了了解Web可伸缩性的细节,我们与一些专家进行了交谈,并询问了他们改善Web可伸缩性的技巧。

Web可扩展性的基本要素

从一开始就选择正确的工具

选择具有可伸缩性的Web框架应该是确保可伸缩性的第一步。如果网站从一开始就建立了强大的框架,则它在业务的其他方面(例如财务,营销,管理,人力资源等)的表现都可以很好。

可以这样考虑:如果您从一开始就为房屋(网站)打下坚实的基础,则可以期望将来将房屋建造得更多,更坚固,更大。

但是,不要屈服于坚持相同框架的想法。将基于PHP的网站扩展到数十亿用户是不可能的。话虽这么说,但如果情况出现了,您可能会在桌子上转过身而落下一个特定的技术栈–毫不犹豫地做。

用Aditya Agarwal(DropBox的工程副总裁)的话来说,“选择该选项时,通常会在部署,监视,操作等方面产生开销。如果选择使用服务体系结构,则必须自己构建大多数后端,这通常会花费很多时间。使用LAMP堆栈,您可以免费获得很多。一旦您离开了LAMP堆栈,服务配置和监视之类的事情将由您决定。当您深入研究服务方法时,您必须重新发明轮子。”

实施多级缓存以减少缓存未命中的机会

您是否曾经注意到,当您第一次加载网页时,所花的时间要比您访问该网页所需的第二,第三等时间长一点?这是一种智能逻辑,它在Web浏览器的后台进行了缓存。

缓存使应用程序更容易执行,因为它避免或延迟了每次必须加载页面时对服务器的请求。但是,在复杂应用程序的情况下进行缓存非常棘手。这就是为什么建议在应用程序中实现多级缓存以使其可扩展的原因。

根据Jared Rerie 的说法,“关于服务器正在缓存的争论,那么为什么要客户机呢?” 以我的经验很常见。也许是因为我们被教导要避免重复(不要重复自己)。有人可能会说,实施缓存的几个团队是一种浪费性的重复工作。虽然多层缓存会给系统带来复杂性,但它并不是浪费,甚至不是真正的重复,因为客户端和服务器端的缓存可能有很大的不同。

使用多个数据库维护复杂系统中的数据完整性

在开发可扩展的应用程序时,在SQL数据库和NoSQL数据库之间进行选择通常很繁琐。更糟糕的是,两种数据库的营销热潮使这一决定变得更加困难。

用Ysance的架构师Frederic Faure的话来说,“我发现SQL和NoSQL(不仅是SQL)的定位是相反的,这实在令人遗憾:NoSQL的营销浪潮确实促使了已经存在的系统的重新推广。在相当长的一段时间内,但是在大多数情况下很少考虑到这一点,因为毕竟,所有内容都可以放入“良好的旧SQL模型”中。希望使所有内容都适合NoSQL模型的相反趋势也不是非常有利可图。”

实际上,scalegrid.io进行的一项调查表明,44.3%的企业合并了两个或三个数据库以扩展其应用程序。而且,SQL和NoSQL是超过75.6%的用户使用的最受欢迎的多数据库组合。

这就是使用多个数据库对改善网站可伸缩性产生重大影响的原因。

除非有充分的理由,否则不要存储状态

有状态与无状态是整个网络上的普遍争论,开发人员在两者的利益上存在分歧。

所有这些争论的共同点对于可伸缩性都几乎没有意义。无状态(与在Web应用程序中不存储任何状态有关)使您可以简化应用程序的客户端/服务器通信模型。这样做的主要好处是,客户端可以在不存储服务器状态的情况下向服务器请求任何内容。此外,由于无需更改整个Web服务器上的会话池,因此您的应用程序可以轻松扩展。

另一方面,当将状态存储在Web应用程序中是一个好主意时,可能会有一些用例。Lightbend的开发者倡导者Hughe Mckee在他的博客“ 如何构建成功的云原生解决方案 ”中解释了在购物车应用程序中保存状态的好处。本文通过一个购物车示例说明了有状态应用程序的扩展功能。

Per Hughe说:“谈到云原生软件系统时,确定最佳方法取决于具体情况。在考虑无状态系统与有状态系统时,这当然适用。在许多情况下,无状态方法是可以接受的解决方案。但是,越来越多的场景使用有状态方法将是更好的选择。对于高性能近实时和基于流的系统的需求不断增长,这无疑是正确的。“

异步

毋庸置疑,“异步编程是提高Web可伸缩性的行之有效的方法。”

但是这个说法有多正确呢?乌迪·达汉(Udi Dahan)可能有答案。

用乌迪·达罕(Udi Dahan)的话说:“通常,在我从事咨询工作时,我遇到了一些人,即使在他们同意异步通信模式带来的固有可伸缩性之后,'有些事情也无法做到异步'。一个经常被引用的例子是用户身份验证-采取用户名和密码组合并针对某些后端存储对它进行身份验证。”

使用异步IO时,您正在同时处理数千个请求,而不会阻塞其中的任何一个。一些单线程框架(例如Node.js)可以高效地执行此操作。

避免任何单点故障

失败是不可避免的。Web应用程序必须不受任何单点故障的影响。无论是服务器,数据库,消息队列,磁盘驱动器,都必须隔离并且独立发挥功能,以确保当它们失败时,整个系统都不会崩溃。

但是,在决定隔离任何故障或根除任何SPOF之前,请问自己一个问题:如果您编写的代码根本不起作用怎么办?如果最终编写的旧的旧代码在某个时候难以维护和扩展怎么办?

Orbit的联合创始人肖恩·赫尔(Sean Hull)建议您在准备系统进行扩展之前消除任何单点故障。

用Sean的话来说,“ 如果您的数据位于单个主数据库中,那将是单点故障。如果您的服务器位于单个磁盘上,那就是单点故障。这只是跟腱的技术白话。必须不惜一切代价根除这些单点故障。”

相关文章