导读:毫无疑问,作为全球最领先的社交网络,Facebook的高性能集群系统承担了海量数据的处理,它的服务器架构一直为业界众人所关注。CSDN博主yanghehong在他自己最新的一篇博客
Facebook的服务器架构》
中分享了他的看法。

大体层次划分

Facebook的架构可以从不同角度来换分层次。

一种是:一边是PHP整的经典的LAMP stack;另外一个是非PHP整的各种service。

Facebook的页面从刚创立的时候扎克伯格写的,到现在,都用PHP开发。后端有用各种语言开发的service。它们之间用跨语言的thrift RPC通信(Scribe也是建立在Thrift之上)。

另外一个角度划分的层次是:

前面是负载局衡器(没说是用硬件的还是软件的);负责分配 前端的Web服务器, Web服务器是用PHP来聚合数据;最后面是 Services,Memcached和数据库。

有意思的是对后面三种的定性:

Services – 快速,复杂; 自己开发的业务进程,来实现复杂的业务逻辑,速度快。

Memchached – 快速,简单;Memchached做简单的key-value缓存,服务应用快速的读请求。

数据库 – 缓慢,持久。数据库做持久存储,磁盘IO自然慢,不过有memcached做缓存没关系。

NewsFeed的架构

写:

Bob更新状态,Web服务器上的PHP程序除了将内容到MySQL数据库之外,也将该行为动态的ID通过Scribe发到一个Leaf Server上(根据Bob的用户ID选的Leaf Server)。

读:

另一个人Alice打开Facebook,加载主页,PHP程序向Aggregator服务器查询(Thrift调用),Aggregator从若干个Leaf Server里头读出Alice的朋友的所有行为动态/action的前四十个,aggregator做聚合和一定的排序,返回给PHP程序。

PHP程序获得这些行为动态的ID之后,从Memcached中读出这些ID对应的内容,如Memcached没有则从MySQL数据库中读,汇聚后生成HTML返回给浏览器。

Chat的架构

页面请求,仍WEB服务器处理(PHP)处理,当然也依赖web tier之后的各种Service。比如查看消息历史啊,在线用户列表啊,发送聊天消息啊。

接收聊天消息,则没通过PHP服务器,而是专用的用Erlang写的Channel服务器来处理,通过long-polling来接收聊天消息。Channel服务器是Chat服务的核心部件。发送的消息通过web tier发到Channel服务器。

后方有用C++写的chatlogger服务器来做历史记录的读写。

同样也用C++写了presence服务器来从channel服务器汇集在线状态。

系统的简化结构如下图所示:

Web tier, chatlogger, presence, channel 都是多个服务器组成的集群。

Channel服务器有根据User ID做分区,每个分区由一个高可用的Channel集群服务。

Web tier, chatlogger, presence,在公开的文章和PPT中并没说这些集群具体怎么做分布和冗余备份的。

转自:http://www.csdn.net/article/2011-06-10/299486

最新文章

  1. VisualSVN 4.0.11补丁原创发布
  2. 手动获取酷我Mp3外链
  3. Android项目实战(十):自定义倒计时的TextView
  4. BZOJ1770 : [Usaco2009 Nov]lights 燈
  5. 常见的Web负载均衡方法
  6. 【考试】简单的sql语句
  7. Linux ---> 简单socket
  8. Meteor错误:TypeError: Meteor.userId is not a function
  9. 博客搬家到CSDN:http://blog.csdn.net/yeweiouyang
  10. linux系统必学-部分链接
  11. Java第九周学习总结
  12. bzoj 1930: [Shoi2003]pacman 吃豆豆 [费用流]
  13. Java中“==”和“equals()”的区别
  14. sprintf补位
  15. Vue(十八)Element UI
  16. 安卓MVP框架
  17. Java连接postgreSQL数据库,找不到表。
  18. docker 加速器配置目录
  19. Go语言之进阶篇获取文件属性
  20. STL_函数对象01

热门文章

  1. Vue报错 type check failed for prop “xxx“. Expected String with value “xx“,got Number with value ‘xx‘
  2. 助你上手Vue3全家桶之VueX4教程
  3. linux环境下redis安装(redis伪集群搭建)
  4. centos 下安装docker
  5. 『动善时』JMeter基础 — 57、Linux系统中运行JMeter脚本
  6. Java Logback简易教程
  7. buuoj刷题 October
  8. 动手写一个简单的Web框架(模板渲染)
  9. 菜鸡的Java笔记 第十四 String 类常用方法
  10. 【从零开始学习Node.js】一.在CentOS 7中部署Node.js环境