我和我的团队正在开发一个需要能够处理相当繁忙的流量的应用程序.不是Facebook级别,但在未来我希望能够扩展到没有大量代码重写.
我的想法是通过自己的界面将所有内容模块化为单独的服务.因此,例如,消息传递将具有可能具有send和getMessages()作为方法的消息传递接口,然后PHP Web应用程序将通过soap或curl或类似的东西简单地查询该接口.然后,消息传递应用程序可以是任何类型的应用程序,因此Java应用程序或Python或任何适合于具有其自己的单独数据库分片的特定功能的应用程序.
这是一个好方法吗?
我的想法是通过自己的界面将所有内容模块化为单独的服务.因此,例如,消息传递将具有可能具有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,memcached,redis.
首先描述您的PHP代码,然后优化低挂果.我发现Rasmus Lerdorf的这个音频文件非常有用.阅读博客文章时,您会发现很多提高性能的好建议.
另外我会考虑离开关系数据库,转而使用例如Cassandra.这是我最近看到很多大牌玩家的举动(例如twitter,digg,facebook,reddit).你必须以这种方式完全不同的心态,但我敢打赌,这将是值得的.
使用例如beanstalkd,gearman或google app engine的taskqueue对所有内容进行排队并取悦每个人.
这听起来很合理作为第一步,请记住PHP层和消息传递层之间的流量会增加一些延迟.您可能还会考虑:
使用(例如)memcached在PHP层上缓存数据.您还可以考虑使用Web代理缓存,例如squid
通过将会话数据存储在数据库中,将Web服务器扩展到多台计算机.一旦你可以支持2个Web服务器,添加第三个(第四个,第五个等)应该很简单.请记住,您最终可能还需要将消息传递层扩展到多台计算机.
使用PHP e-Accelerator等工具缓存已编译的脚本; 应该有助于提高Web层的性能
有一些关于高可伸缩性的好文章,你可能会觉得有帮助.
最后,请记住,过度设计解决方案很容易.最好的办法是在整个过程中持续测量负载,性能,资源利用率等 - 然后根据需要使用这些数据进行调整.