繁体   English   中英

构建高度可扩展的Web服务

[英]Building highly scalable web services

我和我的团队正在开发一个需要能够处理相当繁忙的流量的应用程序。 不是Facebook级别,但在未来我希望能够扩展到没有大量代码重写。

我的想法是通过自己的界面将所有内容模块化为单独的服务。 因此,例如,消息传递将具有可能具有send和getMessages()作为方法的消息传递接口,然后PHP Web应用程序将通过soap或curl或类似的东西简单地查询该接口。 然后,消息传递应用程序可以是任何类型的应用程序,因此Java应用程序或Python或任何适合于具有其自己的单独数据库分片的特定功能的应用程序。

这是一个好方法吗?

Modularise

我的想法是通过自己的界面将所有内容模块化为单独的服务。 因此,例如,消息传递将具有可能具有send和getMessages()作为方法的消息传递接口,然后PHP Web应用程序将通过soap或curl或类似的东西简单地查询此接口

我喜欢将每个服务模块分开的想法(良好的编码原理)。 我不喜欢关于SOAP的部分:(。我认为这是复杂的方法。我会选择像JSON-RPC之类的东西。

一些快速提示:

我和我的团队正在开发一个需要能够处理相当繁忙的流量的应用程序。 不是Facebook级别,但在未来我希望能够扩展到没有大量代码重写。

  • 像其他人一样也暗示我建议你去看看High Scalability博客
  • 首先使用YSlow / google 页面速度关注前端。 这种优化很容易实现,可以为您带来显着的提升。 来自Yslow网页的引用:

最终用户响应时间的80%用于前端。 大部分时间都在下载页面中的所有组件:图像,样式表,脚本,Flash等。减少组件数量反过来减少了呈现页面所需的HTTP请求数量。 这是更快页面的关键。

  • 我还建议你看一下php的HipHop ,它将你的php代码转换为C代码,这对facebook来说是一个巨大的推动力。 文章的引用:

使用HipHop,我们将Web服务器上的CPU使用率平均降低了约50%,具体取决于页面。 CPU越少意味着服务器越少,这意味着开销越少

  • 我想如果还没有设置的另一个重大/简单的改进是使用APC(操作码缓存)来缓存已编译的代码。 这将为您提供巨大的推动力(转换为HipHop的部件不需要)。
  • 如果您希望您的网站扩展,您必须遵循口头禅:

    RAM是新磁盘

    !缓存,缓存,缓存! 例如APC, memcachedredis

  • 首先描述您的PHP代码,然后优化低挂果。 我发现Rasmus Lerdorf的这个音频文件非常有用。 阅读博客文章时,您会发现很多提高性能的好建议。
  • 另外我会考虑离开关系数据库,转而使用例如Cassandra 这是我最近看到很多大牌玩家的举动(例如twitter,digg,facebook,reddit)。 你必须以这种方式完全不同的心态,但我敢打赌,这将是值得的。
  • 使用例如beanstalkdgearman或google app engine的taskqueue所有内容进行排队并取悦每个人

这听起来很合理作为第一步,请记住PHP层和消息传递层之间的流量会增加一些延迟。 您可能还会考虑:

  • 使用(例如) memcached在PHP层上缓存数据。 您还可以考虑使用Web代理缓存,例如squid

  • 通过将会话数据存储在数据库中,将Web服务器扩展到多台计算机。 一旦你可以支持2个Web服务器,添加第三个(第四个,第五个等)应该很简单。 请记住,您最终可能还需要将消息传递层扩展到多台计算机。

  • 使用PHP e-Accelerator等工具缓存已编译的脚本; 应该有助于提高Web层的性能

有一些关于高可伸缩性的好文章,你可能会觉得有帮助。

最后,请记住,过度设计解决方案很容易。 您最好的选择是在整个过程中持续测量负载,性能,资源利用率等 - 然后根据需要使用此数据进行调整。

缓存,缓存和更多缓存。 SQL查询缓存,操作码缓存,避免多次查询相同的事情。 然后在运行时使用分析器来跟踪慢点的位置。

围绕一组模块进行高级设计是管理复杂性和结构开发的一种好方法(更是如此,在微观层面)

PHP Web应用程序只需通过soap或curl查询此接口

这在应用程序中引入了大量延迟。 我建议定义API,但对于任何同步处理的请求,尽可能在单个线程中运行尽可能多的代码。

当然,如果你必须处理多种开发语言,使用通过HTTP运行的接口是一个非常实用的解决方案 - 但是如果你在PHP中开发前端,那么通过编程到一个抽象的PHP API(可能会调用Soap,Corba) ,或其他东西),你仍然可以选择以后以不同的方式重新实现后端。

我不确定你的消息是什么意思。 如果您正在谈论异步请求处理,那么您需要考虑如何在PHP中实现订阅者。 这是一个完整的蠕虫病毒 - 我没有看到用PHP编写的良好的消息处理系统 - 但我还没有看到用Java编写的一个很好的可扩展解决方案 - 其中包括高端一些主要参与者的产品系统。 也许有一天我会写一个;)在此期间,你真的希望保持你的复杂(并且可能不太可靠)的业务逻辑在任何类型的订阅者守护程序的单独线程中运行 - 所以一个明显的方法是将目标公开为网页,并让订阅者作为守护进程运行,只需获取消息并调用基于Web的API。

如果您完全关注性能/可靠性/可伸缩性,那么您真的不希望基于消息传递建立同步系统。

HTH

C。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM