facebook架构解析(转)

news/2024/7/19 19:19:54 标签: 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集群服务。

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

  互联网上的资料:

  http://www.infoq.com/presentations/Scale-at-Facebook

  Facebook前工程总监Aditya Agarwal在QCon London2010 上的演讲。

  http://www.infoq.com/presentations/Facebook-Software-Stack

  Aditya Agarwal在 QCon SanFrancisco 2008上的演讲,和QCon London 2010 上的没什么区别...

  http://www.infoq.com/presentations/Evolution-of-Code-Design-at-Facebook

  Facebook工程师Nick Schrock在QCon London2011上介绍它们是怎么写代码的。

  http://www.infoq.com/presentations/Infrastructure-at-Facebook

  Facebook的基础平台(Infrastructure)团队经理Jason Sobel在QCon San Francisco 2010上的演讲。

  http://www.youtube.com/watch?v=T-Xr_PJdNmQ&feature=player_embedded

  Velocity 2010: Tom Cook, "A Day in theLife of Facebook Operations"

  http://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf

  http://www.facebook.com/note.php?note_id=14218138919


http://www.niftyadmin.cn/n/1199544.html

相关文章

PXE 懒人安装多个系统

1网络引导安装安装树服务器 (放置安装树源文件)Dhcp 服务器 Pxe客户端请求Dhcp分发给客户端ip地址(通讯) Dhcp tftpserver() 存放(pxe 内核 驱动镜像 ks.cfg) 配置参数文…

Thrift框架调研(转)--rpc

u 简介 Thrift是一种开源的跨语言的RPC服务框架。Thrift最初由facebook公司开发的,在2007年facebook将其提交apache基金会开源了。对于当时的facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传输通信以及系统之间语言环境不同需要跨平台的特性。…

简单的JS计算器

<% Page Language"C#" AutoEventWireup"true" CodeBehind"JSQ.aspx.cs" Inherits"周五的练习Kindeditor3._29.JSQ" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/…

Thinking in Java之接口回调

实在抱歉啊排版有问题现在已经重写&#xff1a; 地址&#xff1a;http://blog.csdn.net/kiritor/article/details/8755535 回调概念 "回调&#xff0c;回调"到底是个啥呢&#xff1f; 通过以前的学习知道的是在事件驱动设计模式情况下&#xff0c;回调就是将一个方法…

tomcat目录安全与普通用户启动tomcat

如果用root用户直接启动tomcat会有很多不安全因素&#xff0c;所以建议普通用户启动tomcat 1.修改tomcat/bin/catalina.sh文件&#xff0c;加入 export JAVA_HOME/usr/java/java1.6.0_27 #&#xff2a;&#xff21;&#xff36;&#xff21;_HOME路径 2.添加www普通用户 #u…

maven问题

问题1&#xff1a; Eclipse 中 新建maven项目 无法添加src/main/java 问题 eclipse创建maevn web项目&#xff0c;在选择maven_archetype_web原型后&#xff0c;默认只有src/main/resources这个Source Floder。 按照maven目录结构&#xff0c;添加src/main/java、src/test/java…

maven 中jetty启动

Maven配置代码 <!-- 添加此插件以便启动jetty --> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.10</version> <configuration> …

Android使用继承View类来绘图

添加新类MyView继承View 在MyView中实例化Paint 1 package com.hu.viewdemo;2 3 import android.content.Context;4 import android.graphics.Canvas;5 import android.graphics.Color;6 import android.graphics.Paint;7 import android.graphics.Paint.Style;8 import androi…