设计可扩展的基于 Web 的应用程序的关键因素

Posted

技术标签:

【中文标题】设计可扩展的基于 Web 的应用程序的关键因素【英文标题】:Key factors for designing scalable web based application 【发布时间】:2010-11-20 01:29:21 【问题描述】:

目前我正在开发基于 Web 的应用程序。我想知道设计师在设计可扩展的基于 Web 的应用程序时应该注意哪些关键因素?

【问题讨论】:

【参考方案1】:

每个应用程序都是不同的。您必须分析您的应用程序,以查看您应该将优化工作集中在哪里。一些 Web 应用程序可能需要数据库访问优化,而另一些则具有导致瓶颈的复杂业务逻辑。

在未进行分析之前,请勿尝试优化应用程序的任意部分。您最终可能不得不支持复杂的优化代码,而这实际上并不能让您的应用程序更快捷。

【讨论】:

【参考方案2】:

好好阅读highscalability.com 应该会给你一些想法。我强烈推荐亚马逊文章。

【讨论】:

我不会真正实施任何这些策略,直到他们需要。考虑到它们进行设计,但根据需要实施优化。【参考方案3】:

这是一个相当模糊和广泛的问题,你可以写书。你能走多远?在某些时候,SQL JOIN 的性能会崩溃,您必须实施一些分片/分区策略。你说的是这个级别吗?

一般原则是:

缓存和版本化所有静态内容(图片、CSS、javascript); 将此类内容放在另一个域中以阻止不必要的 cookie 流量; GZip/deflate 一切; 只执行需要的Javascript; 永远不要使用 Javascript 做您可以在服务器端做的事情(例如,使用 CSS 样式表行,而不是使用花哨的 jQuery 奇数/偶数技巧,这可能是一个实时杀手); 尽量减少外部 HTTP 请求。这意味着很少有 CSS、Javascript 和图像文件。这可能意味着实现某种形式的 CSS spriting 和/或组合 CSS 或 JS 文件; 在必要时使用服务器端缓存,但仅在您发现问题后才使用。内存是一种昂贵但通常有效的折衷方案,以换取更高的性能; 测试和调整所有数据库查询; 尽量减少重定向。

【讨论】:

+1。但是你能解释一下你所说的“使用花哨的 jQuery 奇数/偶数技巧......可以成为一个实时杀手”吗?可以说,它会使页面在 client 端的渲染速度变慢一些,但它对 webapp 的可扩展性有何负面影响? @ChssPly76 网络应用程序是否实际上按我们可以看到的某些指标进行扩展并不重要。重要的是扩展到最终用户的感知 @Rex M - 虽然这是真的,但它与手头的主题无关。除非您的页面有许多表,每个表都有很多行,否则 jQuery 装饰它们所花费的时间可以忽略不计。如果确实有这么多表/行,则很可能需要 更长的时间 来生成/下载/呈现具有所有其他 class="odd" 属性的页面,即使使用 gzip 和所有属性也是如此。 @cletus 很好地推荐了一年后的那些“经验教训”,对吧? ;) +1【参考方案4】:

没有。只需使用适当的设计技术(关注点分离等)对应用程序进行编码,然后在应用程序完成或即将完成时,进行性能测试。然后你会发现真正的瓶颈——它们不会是你一开始可能猜到的。这就是您从一开始就进行适当设计的地方 - 它可以轻松进行更改以解决瓶颈。

【讨论】:

@Rex M:我同意你的看法。但只是想知道在设计时我应该注意哪些关键因素以提高可扩展性?【参考方案5】:

有时,一个具体的答案比一般的提示更有帮助。

如果您想扩展,唯一的目标是速度(硬件和软件)和资源(硬件)。

硬件,后者很昂贵(更多的服务器、负载平衡器等)。

因此,通过仔细选择您的初始开发框架,您将节省大量时间和资源 - 多达几个数量级。

例如,nginx 比 Apache 快(很多)。

其他解决方案比 nginx 更快(对于静态和动态内容),但我无法在不被 *** 审查的情况下披露它们(尽管这是一个免费的解决方案,但它被评为垃圾邮件和广告)。

这就是“分享”的局限:我们必须只分享“可接受”的解决方案,而不是有效的解决方案。

干杯,

皮埃尔。

【讨论】:

【参考方案6】:

我从这里的其他答案中了解到,可扩展性和性能之间普遍存在混淆。高性能意味着响应速度快。高可扩展性意味着无论有多少其他人同时使用该站点,您都能得到响应。有很大的不同。

事实上,您实际上必须牺牲一点性能才能获得良好的可扩展性。可扩展性的一般模式是分布式计算。将功能分解到不同的集群服务器层(Web、业务规则、数据库)是实现可扩展性的常用方法。额外的往返会稍微减慢页面加载速度。

每个人都希望专注于高可扩展性,但也不要忘记,对于向自行托管应用程序的客户出售许可证的软件供应商而言,缩小规模与扩大规模同样重要。一个可以为 10 个用户在单个服务器上运行但也可以配置为在 10 个服务器 Web 集群、3 个服务器中间层和 10,000 个用户的 4 个服务器数据库集群上运行的应用程序将是一个为可扩展性而设计的系统。

【讨论】:

以上是关于设计可扩展的基于 Web 的应用程序的关键因素的主要内容,如果未能解决你的问题,请参考以下文章

基于 Web 应用程序中的事务数据以可扩展的方式计算结果?

可扩展的图像存储

技术漫谈 | openresty高性能web

规划可扩展的 Web 应用程序开发

2019第17周日

在 web 应用程序中使用基于 C 的 API(混乱)的 Javascript 扩展