我和我的团队正在开发一个需要能够处理相当繁忙流量的应用程序。不是Facebook级别,但在未来我希望能够在没有大量代码重写的情况下扩展到它。
我的想法是通过自己的界面将所有内容模块化为单独的服务。因此,例如,消息传递将具有可能具有send和getMessages()作为方法的消息传递接口,然后PHP Web应用程序将通过soap或curl或类似的东西简单地查询该接口。然后,消息传递应用程序可以是任何类型的应用程序,因此Java应用程序或Python或其他任何适用于具有其自己的单独数据库分片的特定功能。
这是一个好方法吗?
答案 0 :(得分:20)
我的想法是模块化 一切都进入单独的服务 他们自己的接口。所以举个例子 消息传递将有消息传递 可能有发送和的接口 getMessages()作为方法,然后是 PHP Web应用程序只会查询这个 通过肥皂或卷曲或 类似的东西
我喜欢将每个服务模块分开的想法(良好的编码原则)。我不喜欢关于SOAP的部分:(。我认为这是复杂的方式。我会选择像JSON-RPC之类的东西。
我的团队和我在一起 开发需要的应用程序 能够处理相当沉重的 交通。不是facebook级别,而是在 未来我希望能够 在没有大量代码的情况下扩展到 重新写入。
最终用户响应时间的80%是 花在了前端。其中大部分 下载所有的时间都被束缚了 页面中的组件:图像, 样式表,脚本,Flash等 减少中的组件数量 转减了HTTP的数量 呈现页面所需的请求。 这是加快页面的关键。
使用HipHop我们减少了CPU 在我们的Web服务器上平均使用 大约百分之五十,取决于 页。 CPU越少意味着服务器越少 这意味着更少的开销
如果您希望您的网站扩展,您必须遵循口头禅:
答案 1 :(得分:5)
这听起来很合理作为第一步,请记住PHP层和消息传递层之间的流量会增加一些延迟。您可能还会考虑:
通过将会话数据存储在数据库中,将Web服务器扩展到多台计算机。一旦你可以支持2个Web服务器,添加第三个(第四个,第五个等)应该很简单。请记住,您最终可能还需要将消息传递层扩展到多台计算机。
使用PHP e-Accelerator等工具缓存已编译的脚本;应该有助于提高网络层的性能
High Scalability上也有一些很棒的文章,您可能会觉得有帮助。
最后,请记住,过度设计解决方案很容易。您最好的选择是在整个过程中持续测量负载,性能,资源利用率等 - 然后根据需要使用此数据进行调整。
答案 2 :(得分:1)
缓存,缓存和更多缓存。 SQL查询缓存,操作码缓存,避免多次查询相同的事情。然后在跑步时使用分析器来跟踪慢点的位置。
答案 3 :(得分:0)
围绕一组模块设置高级设计是管理复杂性和结构开发的一种好方法(更是如此,在微观层面)
PHP Web应用程序只需通过soap或curl查询此界面
这会在应用程序中引入大量延迟。我建议定义API,但对于任何同步处理的请求,尽可能在单个线程中运行代码。
当然,如果你必须处理多种开发语言,使用通过HTTP运行的接口是一个非常实用的解决方案 - 但如果你正在用PHP开发前端,那么通过编程到一个抽象的PHP API(可能会调用它) Soap,Corba或其他东西),你仍然可以选择以后以不同的方式重新实现后端。
我不确定你的消息是什么意思。如果您正在谈论异步请求处理,那么您需要考虑如何在PHP中实现订阅者。这是一个完整的蠕虫病毒 - 我没有看到用PHP编写的良好的消息处理系统 - 但我还没有看到用Java编写的一个很好的可扩展解决方案 - 其中包括高端一些主要参与者的产品系统。也许有一天我会写一个;)在此期间,你真的希望保持你的复杂(并且可能不太可靠)的业务逻辑在任何类型的订阅者守护程序的单独线程中运行 - 所以一个明显的方法是将目标公开为网页,让订阅者作为守护进程运行,只需获取消息并调用基于Web的API。
如果您完全关心性能/可靠性/可扩展性,那么真的不希望基于消息传递建立同步系统。
HTH
下进行。