我并没有以传统方式设想 Web 应用程序——而是在服务提供者和消费者方面。在工作中,我们有一个在 Tomcat 下运行的 RESTful API 层,通过实现 Shindig 接口构建。该层与 MySQL 以及 MongoDB 交互。我们使用 Memcached 进行近/远缓存,考虑到我们使用大量基于列表和集合的操作,我们计划将其转移到 Redis。该层还为某些 API 与 Twitter 和 Facebook 交互(例如推送状态更新)。所有端点都可以作为符合 OpenSocial 的 REST/XML 调用进行访问。我们使用 NewRelic 来监控服务性能和 SLA。目前,我们的转速略高于 30K RPM,响应时间为 10 毫秒。我们有一个包含 4 个 Tomcat、3 个 memcached、3 个 MySQL(1M 2S)和 3 个 MongoDB(副本)的集群。所有堆栈都在 XenServer 托管的虚拟机上运行,运行 Centos。我们使用 RabbitMQ 进行消息传递/异步操作,例如发送通知或与 3rd 方(Twitter/Facebook)交谈,以免阻塞 VM 线程。随着平台的流行,我们计划在不久的将来迁移到 HornetQ+Scala Actors。搜索在 Solr 上运行,但我们正在积极迁移到 ElasticSearch。
我们在这个基于 API/服务的模型中构建了系统,以便我们可以为多个客户端平台提供服务。因此,当我们的移动应用程序启动时,它可以重用 API,而不是为移动设备单独设置一组相同的堆栈。这种架构抽象了后端产品,不与前端耦合。我们的前端是用 PHP/Zend 构建的,它广泛使用 JQuery。我们正在使用 HTML5、Phonegap 和 Sencha touch 构建移动前端。
为了安全起见,我们有开放的 GET,但写入是通过 2-legged oauth 保护的。一旦我们向外部消费者和应用程序开发人员开放 API,我们将需要提供 3-legged oauth。
我希望这个总结会有所帮助。如果您需要更多信息或有任何疑问,请随时发表评论。