13

我正在重写一个大型网站,需要非常坚固的架构,这是我的几个问题,请原谅我将苹果和橙子以及可能的猕猴桃混合在一起:) 我做了很多研究,最终完全糊涂了。

主要问题:您将采用哪种方法来构建一个预计会以各种方式增长的大型网站?

  1. 单一入口点,数据库中的页面数据,通过将 GET 变量与数据库条目相关联来拉取 (?pageid=whatever)

  2. 单一入口点,单独文件中的页面数据,基于 GET 变量包含(?pageid=whatever 将包含whatever.php)

  3. MVC(好吧,伙计们,我完全赞成,但是除了检查那里的所有教程和框架之外,他们无法掌握这个概念,他们是否将“视图”存储在数据库中?在我看来,如果你有 1000 页相同的页面它们可以由 1 个模型塑造,但我仍然需要 1000 个“视图”文件?)

  4. PAC - 这对我来说听起来更合乎逻辑,但没有找到太多资源 - 如果这是一个好方法,你能推荐任何书籍或链接吗?

  5. DAL/DAO/DDD - 在发布问题之前,我通过认真阅读堆栈溢出来了解这些术语。不确定它是否属于此列表

  6. 坐下来创建我自己的架构(如果没有人在这里启发我,可能会这样做:)

  7. 没有提到的东西...

谢谢。

4

5 回答 5

7

网站的可扩展性/可用性(iow。高流量)最好不要通过您提到的任何项目来解决。尤其是第 1 点和第 2 点;将页面定义存储在数据库中是绝对不行的。MVC 和其他类似的模式更多地是为了代码的清晰和维护,而不是为了可伸缩性。

一个重要的缺失信息是您期望什么样的并发命中/秒?有时,没有建立高流量网站的人会对实际上构成“可扩展性噩梦”的点击率感到惊讶。

有一些关于如何设计可扩展架构的书籍,所以一个 SO 帖子将无法公正地讨论主题,但是一些非常顶级的概念,没有特别的顺序,是:

  • 可扩展性最好首先通过查看基于硬件的解决方案来处理。具有 SSD 磁盘阵列的强大服务器可以走很长的路。
  • 使任何可以是静态的东西成为静态的。尽可能多地从 Web 服务器而不是数据库提供服务。例如,网站上的许多页面从数据库中动态生成数据列表,这些数据列表来自很少或从未真正改变的数据存储。
  • 缓存不经常更改的输出,并调整缓存刷新。
  • 将动态页面构建为无状态或异步的。查看 CQRS 和事件溯源,寻找有利于/促进扩展的模式。
  • 调整您的查询。数据库通常是最大的瓶颈,因为它是共享资源。许多 Web 应用程序构建者使用 ORM 来创建糟糕的查询。
  • 调整您的数据库引擎。备份、复制、扫描、日志记录,所有这些都只需要你引擎的一点资源。调整它可以导致更快的数据库,从而为您从横向扩展中争取时间。
  • 减少来自客户端的 HTTP 请求数。每个 HTTP 连接都有开销。检查您的页面,看看您是否可以增加每个请求中的有效负载,以减少单个请求的总数。

此时,您已经优化了一台服务器上的行为,您必须“横向扩展”。现在,事情变得非常复杂非常快。各种类型的负载平衡场景(分片、DNS 驱动、哑平衡等),在不同 DB 上分离读取数据和写入数据,使用 Google Apps 等虚拟化解决方案,将静态内容卸载到大型 CDN 服务,使用像 Erlang 或 Scala 这样的语言并并行化您的应用程序等...

于 2010-11-30T21:29:50.450 回答
2

单一入口点,数据库中的页面数据,通过将 GET 变量与数据库条目相关联来拉取 (?pageid=whatever)

维护的潜在噩梦。如果您的团队超过 2-3 人,也可以用于开发。您需要为每个人创建一套严格的规则来遵守 - 如果使用 MVC,这些努力会更好。2也一样。

MVC(好吧,伙计们,我完全赞成,但是除了检查那里的所有教程和框架之外,他们无法掌握这个概念,他们是否将“视图”存储在数据库中?在我看来,如果你有 1000 页相同的页面它们可以由 1 个模型塑造,但我仍然需要 1000 个“视图”文件?)

这取决于有多少页面布局。大多数 MVC 框架允许您使用结构化视图(即主页面视图、子视图)。将视图视为网页的 HTML 模板。您需要多少个模板和子模板就是您将拥有多少个视图。我相信大多数网站最多可以有 50 个主视图和 100 个子视图 - 但这些都是非常大的网站。看看我运行的一些网站,总共有 50 次浏览。

DAL/DAO/DDD - 在发布问题之前,我通过认真阅读堆栈溢出来了解这些术语。不确定它是否属于此列表

确实如此。如果您需要元视图或元模型,DDD 非常棒。假设您的所有模型在结构上都非常相似,但仅在使用的数据库表上有所不同,并且您的视图几乎 1:1 映射到模型。在这种情况下,现在是 DDD 的好时机。一个很好的例子是一些 ERP 软件,你不需要为所有的数据库表单独设计,你可以使用一些统一的方式来完成所有的 CRUD 操作。在这种情况下,您可能会摆脱一个模型和几个视图——所有这些都是在运行时使用元模型动态生成的,该元模型将数据库列、类型和规则映射到编程语言的逻辑。但是,请注意,构建一个高质量的 DDD 引擎确实需要一些时间和精力,以使您的应用程序看起来不像是被黑掉的 MS Access 程序。

坐下来创建我自己的架构(如果没有人在这里启发我,可能会这样做:)

如果您正在构建一个面向公众的网站,那么您很可能会使用 MVC 做得很好。一个很好的起点是查看 CodeIgniter 视频教程。它帮助我了解 MVC 的真正含义以及如何使用它比我阅读的任何 HOWTO 或手册更好。他们总共只需要 29 分钟:

http://codeigniter.com/tutorials/

享受。

于 2010-11-30T21:28:29.617 回答
1

我是 MVC 的拥趸,因为我发现当一切都有一个位置并且很好并且被划分时,扩展你的团队会更容易。这需要一些时间来适应,但最简单的方法就是潜入其中。

也就是说,一定要检查您当地的图书馆,看看他们是否有 O'Reilley 关于缩放的书:http: //oreilly.com/catalog/9780596102357,这是一个很好的起点。

于 2010-11-30T17:43:14.367 回答
1

如果您正在创建一个“大”网站并且没有完全掌握 MVC 或 Web 框架,那么 CMS 可能是更好的途径,因为您可以使用您认为合适的插件来扩展它。通过这条路线,您可以更多地担心内容和页面结构,而不是平台。只要您选择合适的CMS。

于 2010-11-30T17:49:51.793 回答
1

我建议使用一些野外的 web mvc 框架创建一个模拟应用程序,然后选择一个,你的开发足够顺利。如果您想掌握 mvc 的概念并准备好轻松地将新功能添加到您的 Web 中,那么在坚实的基础上建立您的代码是基础。

于 2010-11-30T18:55:42.693 回答