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

7

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

6个回答

5
这是一个相当模糊和广泛的问题,需要写一些书才能回答。你有多远的计划?在某个点上,SQL JOIN的性能会崩溃,你必须实施一些分片/分区策略。这是你所指的层次吗?
一般原则是:
  • 缓存并版本化所有静态内容(图像、CSS、Javascript);
  • 将这样的内容放在另一个域中,以防止不必要的cookie流量;
  • 使用GZip/deflate来压缩所有内容;
  • 仅执行所需的Javascript;
  • 不要使用Javascript来处理可以在服务器端完成的任务(例如使用CSS对表格行进行样式设置,而不是使用花哨的jQuery奇偶技巧,这可能会浪费大量时间);
  • 尽可能减少外部HTTP请求。这意味着非常少的CSS、Javascript和图像文件。这可能意味着实施某种形式的CSS spriting和/或合并CSS或JS文件;
  • 必要时使用服务器端缓存,但只有在发现问题后才使用。内存是更高性能的昂贵但经常有效的权衡方案;
  • 测试和优化所有数据库查询;
  • 最小化重定向。

+1。但是你能解释一下你所说的“使用花哨的jQuery奇偶技巧...可能会浪费很多时间”是什么意思吗?这可能会使页面在客户端方面渲染得稍微慢一些,但它如何对Web应用程序的可扩展性产生负面影响呢? - ChssPly76
@ChssPly76,无论我们能否看到 Web 应用程序是否按某些度量标准实际扩展,都不重要。重要的是对最终用户来说,扩展的感知是什么。 - Rex M
@Rex M - 虽然这是真的,但它与手头的话题无关。除非您的页面有许多具有许多行的表格,否则jQuery装饰它们所需的时间是可以忽略不计的。如果确实有那么多的表格/行,即使使用gzip等所有附加的class="odd"属性,生成/下载/呈现页面也很可能需要更长的时间。 - ChssPly76
@cletus 很好地推荐了那些“一年后的经验教训”,对吧? ;) +1 - OscarRyz

2

仔细阅读highscalability.com应该会让你有一些想法。我强烈推荐亚马逊的文章。


然而,在需要它们之前,我不会实际实现这些策略。在设计时考虑它们,但在需要时再实现优化。 - Ben S

1
每个应用程序都是不同的。您需要对应用程序进行分析以确定应该集中优化的位置。有些Web应用程序可能需要数据库访问优化,而其他应用程序可能具有导致瓶颈的复杂业务逻辑。
在未进行分析之前,请勿尝试优化应用程序的任意部分。您可能最终需要支持复杂的优化代码,但实际上并没有使应用程序更加流畅。

1

我从其他答案中感受到了一个普遍的混淆,即可扩展性和性能之间的区别。高性能意味着响应速度快。高可扩展性意味着无论有多少其他人同时使用网站,您都可以得到响应。这是一个很大的区别。

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

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


0

没有特别的方法。只需要使用适当的设计技术(如关注点分离等)编写应用程序,然后在应用程序完成或接近完成时进行性能测试。那时你会发现真正的瓶颈 - 它们可能不是你一开始猜测的那样。这就是从一开始采用适当的设计的好处所在 - 它使得轻松地进行更改以修复瓶颈。


@Rex M:我同意你的观点。但是我想知道在设计时,为了提高可扩展性,我应该注意哪些关键因素? - Silent Warrior

0
有时,具体的答案比一般性的提示更有帮助。
如果你想要扩展规模,唯一需要关注的是速度(硬件和软件)和资源(硬件)。
然而,后者——硬件,成本较高(更多服务器、负载均衡等)。
因此,通过仔细选择最初的开发框架,你将节省大量时间和资源,达到数个数量级的提升。
例如,nginx 比 Apache 更快。
还有其他解决方案比 nginx 更快(对于静态和动态内容),但我不能透露它们,否则在 StackOverflow 上会被标记为垃圾邮件和广告(尽管这是一个免费解决方案)。
这就是“共享”的限制:我们必须分享“可接受”的解决方案,而不是高效的解决方案。
祝好,
皮埃尔。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接