高流量网站的推荐结构

时间:2010-11-30 17:22:33

标签: php model-view-controller data-access-layer dao pac

我正在重写一个大网站,需要非常扎实的架构,这里是我的几个问题,请原谅我混合苹果和橙子,也许还有猕猴桃:)我做了很多研究,最后完全糊涂了。 / p>

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

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

  2. 单个入口点,页面数据在单独的文件中,包含基于GET变量(?pageid =包含whatever.php的任何内容)

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

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

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

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

  7. 未提及的内容......

  8. 感谢。

5 个答案:

答案 0 :(得分:7)

网站的可扩展性/可用性(低流量)可以通过您提及的任何项目得到最好的解决。特别是第1点和第2点;将页面定义存储在数据库中是绝对禁止的。 MVC和其他类似模式更多的是代码清晰度和维护,而不是可伸缩性。

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

有关于如何设计可扩展架构的书籍,因此SO帖子不能主题正义,但是一些非常顶级的概念,没有特别的顺序,是:

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

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

答案 1 :(得分:2)

  

单个入口点,页面中的数据   数据库,通过关联GET拉取   变量与数据库条目   (?的pageid =无论)

潜在的维护噩梦。如果您的团队超过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/

享受。

答案 2 :(得分:1)

我是MVC的粉丝,因为我发现当一切都有一个地方并且很好并且划分区域时,更容易扩展你的团队。需要一些时间来习惯,但最简单的方法就是深入了解。

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我建议在野外创建一个带有一些web mvc框架的模拟应用程序并选择一个,你的开发足够顺利。如果您想要掌握mvc的概念并准备好轻松地向Web添加新功能,那么在可靠的基础上建立代码是至关重要的。