开发CRUD Web应用程序时,典型的瓶颈是什么?

Ste*_*idt 3 ruby-on-rails clojure lift

更新:更精确的措辞可能是" 开发CRUD Web应用程序时的典型性能瓶颈是什么?

我在想网络应用程序,如:

  • Weblog CMS
  • 词汇训练师
  • 网址缩短
  • 互联网论坛

我正在考虑编程语言,如:

  • 红宝石
  • 斯卡拉
  • Clojure的

我在想数据库系统,如:

  • PostgreSQL的
  • MongoDB的
  • CouchDB的

我正在考虑像以下操作系统:

  • Mac OS X.
  • Linux的

我正在考虑典型的现成硬件配置:

http://english.keyweb.de/dedicated/index.shtml

我想到的可能的软件瓶颈是:

  • 编程语言
  • 数据库系统
  • 操作系统

我想到的可能的硬件瓶颈是:

  • 中央处理器
  • 内存
  • 硬盘
  • 网络

mik*_*era 10

如果您构建Web应用程序以获得最大的可伸缩性,那么您的瓶颈最终将归结为协调可变状态的管理(即数据库中需要某种形式的事务语义的部分)

有些要考虑的要点:

  • 不需要同步/事务的静态或数据可以在许多小型商用服务器上廉价地复制.您的NoSQL解决方案(CouchDB等)应该很好地处理这个问题,并结合静态Web数据的许多优秀缓存解决方案.

  • 通过添加更多Web服务器节点,可以轻松地水平扩展本地CPU处理功能(例如,处理单个Web请求).考虑到现代处理器速度,CPU速度不太可能成为您的瓶颈 - 大多数Web应用程序并不需要太多的CPU能力.

  • 然而,数据的事务更新是一个非常棘手的问题.如果你想知道理论解释,请阅读拜占庭将军的问题,但基本上不可能在分布式系统中可靠地协调交易.您必须根据您最重视的内容(数据完整性?性能?可伸缩性?容错性?成本?延迟?)做出一些妥协.

  • 操作系统等并没有太大的区别 - 开销很低,并不会真正影响可扩展性问题.选择你掌握的技能和/或你认为你会发现最容易管理的技能.我个人在Amazon EC2上使用Ubuntu.

鉴于您正在考虑的应用程序类型,我可能会对NoSQL解决方案犯错,因为它听起来有效处理大容量比拥有大量事务数据更重要.您可以随时为需要事务语义的有限数据子集保留PostgreSQL框(用户帐户?主参考数据?某些工作流状态?)

另一种(更经典的)方法是获得一个典型的大型铁数据库(例如Oracle,DB2)并购买昂贵的高端数据库机群.然后有许多廉价的,复制的Web服务器完成大部分工作,并在需要执行事务时根据需要访问数据库集群.这可以非常好地工作到数据库集群开始过载的程度,此时它可能是一个昂贵的瓶颈来扩大......但可以说,如果你负担得起那么多的负载.如果你正在构建一个金融服务应用程序,我会走这条路.

如果您只是在做一个原型或期望开始时的小负载,那么您可以使用单个商品PostgreSQL机器代替昂贵的数据库集群.这可能是设置最简单/最便宜的选项.如果您将数据库访问权限保持在最低限度(大量缓存,仔细查询设计),它实际上可能需要很长时间.请注意,如果您继续增长,它最终将成为您的瓶颈.

ps你提到你正在看Clojure,如果你还没有这样做那么我强烈建议你观看这个视频:http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey - 一个非常独特的对并发性的看法,也提供了对并发环境中管理事务数据的问题的一些见解.