<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>标点符 &#187; Facebook</title>
	<atom:link href="http://www.biaodianfu.com/tag/facebook/feed" rel="self" type="application/rss+xml" />
	<link>http://www.biaodianfu.com</link>
	<description>编译自己的互联网生活</description>
	<lastBuildDate>Wed, 08 Feb 2012 08:42:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Facebook图片存储架构的学习</title>
		<link>http://www.biaodianfu.com/facebook-efficient-storage-of-billions-of-photos.html</link>
		<comments>http://www.biaodianfu.com/facebook-efficient-storage-of-billions-of-photos.html#comments</comments>
		<pubDate>Wed, 25 Jan 2012 15:07:24 +0000</pubDate>
		<dc:creator>标点符</dc:creator>
				<category><![CDATA[程序设计]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[架构]]></category>

		<guid isPermaLink="false">http://www.biaodianfu.com/?p=4606</guid>
		<description><![CDATA[分享照片是Facebook上最流行的的功能之一。截至目前，用户已经上传超过15亿张照片，这使得Facebook成为最大的照片共享网站。对于每一个上传的照片，Facebook都生成并存储四个大小不同的图像，从而转化为共60亿张照片，总容量超过1.5PB。目前以每周220万新照片的速度增长，相当于每周要额外增加25TB存储。在高峰期每秒需要传输55万照片。这些数字对Facebook的照片存储基础设施的一个重大的挑战。 旧的 NFS 照片架构 老的照片系统架构分以下几个层： 上传层接收用户上传的照片并保存在 NFS 存储层。 照片服务层接收 HTTP 请求并从 NFS 存储层输出照片。 NFS存储层建立在商业存储系统之上。 因为每张照片都以文件形式单独存储，这样庞大的照片量导致非常庞大的元数据规模，超过了 NFS 存储层的缓存上限，导致每次请求上传都包含多次I/O操作。庞大的元数据成为整个照片架构的瓶颈。这就是为什么 Facebook 主要依赖 CDN 的原因。为了解决这些问题，他们做了两项优化： 因为每张照片都以文件形式单独存储，大量为目录及文件在NFS 存储层上产生了大量的元数据， 这个规模的元数据量远远超过了超过了NFS 存储层的缓存上限，导致每次招聘请求会上传都包含多次I/O操作。庞大的元数据成为整个照片架构的瓶颈。这就是为什么 Facebook主要依赖 CDN 的原因。为了解决这些问题，他们做了两项优化： Cachr: 一个缓存服务器，缓存 Facebook 的小尺寸用户资料照片。 NFS文件句柄缓存：部署在照片输出层，以降低 NFS 存储层的元数据开销。 新的 Haystack 照片架构 新的照片架构将输出层和存储层合并为一个物理层，建立在一个基于HTTP 的照片服务器上，照片存储在一个叫做haystack 的对象库，以消除照片读取操作中不必要的元数据开销。新架构中，I/O 操作只针对真正的照片数据（而不是文件系统元数据）。haystack 可以细分为以下几个功能层： HTTP 服务器 照片存储 Haystack 对象存储 文件系统 存储空间 在下面的介绍中，我们会对于上述的每个功能层做详细的讲述。 存储空间 Haystack 部署在商业存储刀片服务器上，典型配置为一个2U的服务器，包含： 两个4核CPU 16GB [...]]]></description>
			<content:encoded><![CDATA[<p>分享照片是Facebook上最流行的的功能之一。截至目前，用户已经上传超过15亿张照片，这使得Facebook成为最大的照片共享网站。对于每一个上传的照片，Facebook都生成并存储四个大小不同的图像，从而转化为共60亿张照片，总容量超过1.5PB。目前以每周220万新照片的速度增长，相当于每周要额外增加25TB存储。在高峰期每秒需要传输55万照片。这些数字对Facebook的照片存储基础设施的一个重大的挑战。</p>
<p><strong>旧的 NFS 照片架构</strong></p>
<p>老的照片系统架构分以下几个层：</p>
<ol>
<li>上传层接收用户上传的照片并保存在 NFS 存储层。</li>
<li>照片服务层接收 HTTP 请求并从 NFS 存储层输出照片。</li>
<li>NFS存储层建立在商业存储系统之上。</li>
</ol>
<p>因为每张照片都以文件形式单独存储，这样庞大的照片量导致非常庞大的元数据规模，超过了 NFS 存储层的缓存上限，导致每次请求上传都包含多次I/O操作。庞大的元数据成为整个照片架构的瓶颈。这就是为什么 Facebook 主要依赖 CDN 的原因。为了解决这些问题，他们做了两项优化：</p>
<p>因为每张照片都以文件形式单独存储，大量为目录及文件在NFS 存储层上产生了大量的元数据， 这个规模的元数据量远远超过了超过了NFS 存储层的缓存上限，导致每次招聘请求会上传都包含多次I/O操作。庞大的元数据成为整个照片架构的瓶颈。这就是为什么 Facebook主要依赖 CDN 的原因。为了解决这些问题，他们做了两项优化：</p>
<ul>
<li>Cachr: 一个缓存服务器，缓存 Facebook 的小尺寸用户资料照片。</li>
<li>NFS文件句柄缓存：部署在照片输出层，以降低 NFS 存储层的元数据开销。</li>
</ul>
<p><strong>新的 Haystack 照片架构</strong></p>
<p>新的照片架构将输出层和存储层合并为一个物理层，建立在一个基于HTTP 的照片服务器上，照片存储在一个叫做haystack 的对象库，以消除照片读取操作中不必要的元数据开销。新架构中，I/O 操作只针对真正的照片数据（而不是文件系统元数据）。haystack 可以细分为以下几个功能层：</p>
<ul>
<li>HTTP 服务器</li>
<li>照片存储</li>
<li>Haystack 对象存储</li>
<li>文件系统</li>
<li>存储空间</li>
</ul>
<p>在下面的介绍中，我们会对于上述的每个功能层做详细的讲述。</p>
<p><strong>存储空间</strong></p>
<p>Haystack 部署在商业存储刀片服务器上，典型配置为一个2U的服务器，包含：</p>
<ul>
<li>两个4核CPU</li>
<li>16GB – 32GB 内存</li>
<li>硬件 RAID，含256-512M NVRAM 高速缓存</li>
<li>超过12个1TB SATA 硬盘</li>
</ul>
<p>每个刀片服务器提供大约10TB的存储能力，使用了硬件 RAID-6, RAID 6在保持低成本的基础上实现了很好的性能和冗余。不佳的写性能可以通过RAID控制器和NVRAM缓存回写解决，写由于读取大多是随机的，NVRAM缓存是完全用于写入的。</p>
<p><strong>文件系统</strong></p>
<p>Haystack 对象库是建立在10TB容量的单一文件系统之上。</p>
<p>图片读取请求需要在读取系统调用这些文件的位置偏移，但是为了执行读取操作，文件系统必须先找到实际物理卷上的数据。文件系统中的每个文件都被一个叫做inode结构标识。inode包含了一个磁盘上逻辑文件偏移和物理区块偏移的映射。在使用的特殊类型文件系统时大文件块映射可能相当大。</p>
<p>基于文件系统的区块为给个逻辑区块和大文件保存映射。这些信息通常不适合保存在inode的缓存中，而是存储在在间接地址块。所以在读取文件的时候必须按照特定的流程。这里可以多个是间接地址块，所以一个读取会产生多个I/O取决于是否间接地址块被缓存。</p>
<p>该系统只为连续范围的区块保持映射。一个连续的大文件的块映射可以只由一个范围的标识，这样是适应inode的系统需求的。但是，如果该文件是一个被切割的不连续的块的话，他的块地图可能非常的大。以上可以通过文件系统主动为大的物理文件分配大块的空间来减少碎片。</p>
<p>目前使用的文件系统为XFS，一个很大程度提供高效的文件预分配系统。</p>
<p><strong>Haystack 对象存储</strong></p>
<p>Haystack 是一个简单的日志结构（只能追加），存储着其内部数据对象的指针。一个 Haystack 包括两个文件，包括指针和索引。下面的图片将描述haystack存储文件的布局：</p>
<p><img class="alignnone size-full wp-image-4607" title="haystack-store-layout" src="http://www.biaodianfu.com/wp-content/uploads/2012/01/haystack-store-layout.jpg" alt="" width="604" height="279" /></p>
<p>haystack最前面的8K存储是被超级块占用。紧随超级块是针，每针组成的一个头部，数据和尾部：</p>
<p><img class="alignnone size-full wp-image-4608" title="needles" src="http://www.biaodianfu.com/wp-content/uploads/2012/01/needles.jpg" alt="" width="576" height="267" /></p>
<p>一个针被他的&lt;offset key=”" alternate=”" cookie=”"&gt;元组标识，其中的偏移量为其在haystack存储的偏移。Haystack不在任何健值上做限制，即允许可以有重复键针。下图显示了索引文件的布局：</p>
<p><img class="alignnone size-full wp-image-4609" title="tuple" src="http://www.biaodianfu.com/wp-content/uploads/2012/01/tuple.jpg" alt="" width="604" height="215" /></p>
<p>在haystack存储文件中有每针相应的的索引记录，并且包含针索引记录的顺序必须和haystack存储文件相关的针的顺序相匹配。按照规定索引文件的最低需求是找到一个特定的针在haystack存储文件的元数据。载入和组织索引记录到一个有效的查找数据结构是Haystack程序的责任。索引文件是不是很关键，因为如果需要它可以从haystack存储文件重建。索引的主要职责是让针元数据无需通过较大的Haystack存储文件，快速加载到内存中。原因是其可以让索引编程原来存储的1%。</p>
<p><strong>Haystack 写操作</strong></p>
<p>Haystack 写操作同步将指针追加到 haystack 存储文件，当指针积累到一定程度，就会生成索引写到索引文件。由于索引文件是不是很关键，为了能有更快的性能所以采用异步的方式进行写入。</p>
<p>为了降低硬件故障带来的损失，索引文件还会定期写到存储空间中。在崩溃或突然断电的情况下，将haystack恢复处理器存储中任何残缺的针和截断haystack存储中最后一个有效的针。接下来，它会把丢失的针的索引记录 写到haystack文件的最后。</p>
<p>Haystack不允许重写现有的针偏移，如果一个针数据需要被重写，那么新版本必须使用相同的&lt;key alternate=”" key=”" cookie=”"&gt;元组。应用程序会自动分辨出这两个相同的键，有最大偏移的便是最新的那一个。</p>
<p><strong>Haystack 读操作</strong></p>
<p>传到 haystack 读操作的参数包括指针的偏移量，健，备用键，Cookie 以及数据大小。Haystack为数据大小添加头部和尾部的长度，然后根据数据尺寸从文件中读取整个指针。读取操作成功的关键就是作为参数传递的健，备用键，Cookie是否匹配，数据是否通过了校验，并且针没有被删除掉。（见下文）</p>
<p><strong>Haystack 删除操作</strong></p>
<p>删除操作比较简单 &#8211; 只需要在 Haystack 存储的指针字段中的“删除”位标记一下即可。并且，相关的索引记录不会做任何的修改。是最终的应用程序引用到的是一个删除的针。像这样一个读取删除针的操作将会返回一个相应的错误给应用程序。空间对已删除的针不做任何的回收，只有这样，才能使 haystack 的空间非常的紧凑。（见下文）</p>
<p><strong>照片存储服务器</strong></p>
<p>照片存储服务器负责接受 HTTP 请求，并转换成相应的 Haystack 操作。为了尽量减少服务器检索照片时的I/O操作，该服务器维护着全部 Haystack 中文件索引的缓存。服务器启动时，系统就会将这些索引读到缓存中。由于每个节点都有数百万张照片，必须保证索引的容量不会超过服务器的物理内存。在内存中仅需要保存查找照片所需的少量元数据即可。</p>
<p>对于用户上传的图片，系统分配一个64位的独立ID，照片接着被缩放成4种不同尺寸，每种尺寸的图像拥有相同的随机 Cookie 和64位的密钥，图片尺寸描述（大，中，小，缩略图）被存在代用key 中。接着上传服务器通知照片存储服务器将这些资料连同图片存储到 haystack 中。</p>
<p>每张图片的索引缓存包含以下数据：</p>
<p><img class="alignnone size-full wp-image-4614" title="photo-key" src="http://www.biaodianfu.com/wp-content/uploads/2012/01/photo-key.jpg" alt="" width="604" height="215" /></p>
<p>由于Google的开源 sparse hash data 结构对于每个条目只有2bit的开销，所以Haystack使用它来保证内存中的索引缓存尽可能小。</p>
<p><strong>照片存 储的写/修改操作</strong></p>
<p>写操作将照片数据写到 Haystack 存储并更新内存中的索引。如果该索引记录中包含了相同的键，那么这是一次对现有的照片进行修改的操作。并且只要修改索引记录中的偏移来反应新图像在haystack存储文件的位置。照片存储始终假定，如果有重复的图像（图像具有相同的键），有较大的偏移量的那个存储是有效的。</p>
<p><strong>照片存储的读操作</strong></p>
<p>传递给一个读操作的参包括Haystack ID，照片的 Key, 尺寸以及 Cookie。服务器事先在缓存中按照照片的Key和所需文件的偏移进行查找。如果找到了它，并向haystack发出读取词图像的请求。按照上面说的，haystack的删除操作并不更新它的索引记录，因此添加到内存中的索引可以包含以前删除的照片的内容。当阅读以前的删除的照片失败后，系统将在内存的索引中色绘制词图片的偏移量为0.</p>
<p><strong>照片存储的删除操作</strong></p>
<p>通知 Haystack 执行删除操作之后，内存中的索引缓存会被更新，将偏移量设置为0，表示照片已被删除。</p>
<p><strong>重新整理（压缩）</strong></p>
<p>重新整理（压缩）是一种回收删除和重复的针（针使用相同的Key）的在线操作。它会通过复制针跳过任何重复或删除的条目创建一个新的 haystack。一旦此操作完成它就回去替换掉内存中的文件和结构。</p>
<p><strong>HTTP 服务器</strong></p>
<p>Http 框架使用的是简单的基于开源的libevent库的 evhttp 服务器。使用多线程，每个线程都可以单独处理一个 HTTP 请求。因为我们的系统消耗大多是I/O操作，HTTP服务器的性能并不很重要。</p>
<p><strong>结束语</strong></p>
<p>Haystack 是一个基于 HTTP 的对象存储，包含指向实体数据的指针，该架构消除了文件系统元数据的开销，并实现将全部索引直接存储到缓存，以最小的 I/O 操作实现对照片的存储和读取。</p>
<p>本文作者为Facebook的工程师Peter Vajgel, Doug Beaver 和 Jason Sobel， 由<a href="http://www.biaodianfu.com/">标点符</a>进行翻译。</p>
<p>原文链接（E文）：<a href="http://www.facebook.com/note.php?note_id=76191543919&amp;ref=mf">http://www.facebook.com/note.php?note_id=76191543919&amp;ref=mf</a></p>
<p>Related posts:<ol>
<li><a href='http://www.biaodianfu.com/facebook-xhp.html' rel='bookmark' title='Facebook XHP:让PHP成为模板引擎'>Facebook XHP:让PHP成为模板引擎</a></li>
<li><a href='http://www.biaodianfu.com/facebook-hiphop.html' rel='bookmark' title='Facebook HipHop 源代码发布'>Facebook HipHop 源代码发布</a></li>
<li><a href='http://www.biaodianfu.com/startssl.html' rel='bookmark' title='StartSSL免费的HTTPS证书颁发机构'>StartSSL免费的HTTPS证书颁发机构</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.biaodianfu.com/facebook-efficient-storage-of-billions-of-photos.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook的用户体验评判规则</title>
		<link>http://www.biaodianfu.com/facebook-five-dimensional-design-model.html</link>
		<comments>http://www.biaodianfu.com/facebook-five-dimensional-design-model.html#comments</comments>
		<pubDate>Thu, 07 Jul 2011 12:31:14 +0000</pubDate>
		<dc:creator>标点符</dc:creator>
				<category><![CDATA[用户体验]]></category>
		<category><![CDATA[Facebook]]></category>

		<guid isPermaLink="false">http://www.biaodianfu.com/?p=3960</guid>
		<description><![CDATA[本文来自19楼的UED博客，说是Facebook的内部资料，但是并没有找到出处，并不能辨别真伪，但是文章中间的观点还是非常值得借鉴和学习的。Google的用户体验评价方案只是提供了简单的分析思路，但是没有到具体的点，这篇文章可以弥补这个缺憾。 Facebook 的产品设计五维 情感 精准定位——设计对受众定位清晰，符合该设计目标用户群的使用体验。 亲和力——所有交互元素的设计上，用户对信息沟通顺畅，感觉似有人一般的亲和感。 分享——承载对Facebook连接、自由、生活的文化认同。 留恋度——给人超出想象的空间，让人留恋往返，对产品期待更多，得到二次访问。 易用 反馈及时——在交互过程中，用户的操作能够在屏幕上及时得到反馈效果，帮助用户提高效率。 方位清晰——清晰的知道自己在那里，退路在那里，能够去那里。 路径简短——完成任务在尽可能控制在三步之内，完成某项任务所花废的步骤和时间最短最好。 容错性好——设计限制因素，突出正确操作，隐藏可能的错误操作，减少勿操作。 形美 文字悦读——信息传达易读，符合中文阅读习惯，信息传达快速。 颜色合适——利用大众对颜色理解的寓意，使用正确的色彩加强产品的印象。 布局美观——均衡与对称的构图，使画面整体具有稳定性。 空间感强——运用几何透视的原理，设计中表现远近、层次、穿插等关系。 气势 专业性——细节完美，找不到明显的设计瑕疵。 整体性——所有交互元素的设计上，用户对信息沟通顺畅，感觉似有人一般的亲和感。 品牌成分——体现Facebook品牌形象，并使品牌资产保持延续与统一。 惊喜度——局部设计有贴心且另人惊喜的体验。 创新 共性——符合已知事物的普遍认知。 异性——在共性基础上，给人耳目一新的感受。 复制性——能够促进Facebook其它产品的发展。 颠覆性——在互联网上前所未见，能够变成同行业新的标准。 以上的五维可以说是面面俱到，从逻辑上将可以很好的辨别一个功能和页面到底用户体验如何，基于这样的标准，接下来就是按照标准进行评价了，为了评分更加公正，可以进行内部评分和外部评分来进行区分来达到最好的效果。 产品设计内部评审规则 评价周期 每个设计师每个月被评审1次。 Team leader每周组织一次评审，提前通知设计师。 人员组成 大评委1人(组织本次评审者，由产品设计主管担任) 评委4人以上（部门经理1 人、主管1人、同事1人、其它。） 被评设计师 评审流程 每次由被评设计师自行上报一个最近上线的作品。 会议形式，被评设计师向评委团进行设计理念简单介绍。 评委各自填写评审表，完成后交由大评委。 大评委对评审表进行数据计算，意见汇总，并制作评审报告。 组长负责每次新改版上线的用户数据收集。 保留好原始评审表，进行存档。 打印评审报告，并将评审意见告诉设计师，完成本次评审。 打分规则 产品设计五大指标总共20条，每一条进行0-5分的打分，如果全部满意即为100分。 单条如果打5分，必须写出理由。打0-4分可以不写理由。 计分时，去掉一个最高分和一个最低分，剩下的分数相加后的平均即为最后得分。 根据线上用户调查数据和评委打分各占50%，最后得出该设计的最终得分。 产品设计外部评审规则 线上用户调研也是用Facebook的产品设计五维去做，但不能用评委的版本，否则收集不到任何有用的信息。用户版只从情感、易用、形美、气势、创新五个大维度出题，不需要细化了，并且选项不能有任何引导性。而文字造成不要使用专业术语，用网友常用的网络用语就可以了。 产品设计用户在线调查问卷 [...]]]></description>
			<content:encoded><![CDATA[<p>本文来自19楼的UED博客，说是Facebook的内部资料，但是并没有找到出处，并不能辨别真伪，但是文章中间的观点还是非常值得借鉴和学习的。<a title="Google 用户体验指标衡量方案：HEART" href="http://www.biaodianfu.com/google-user-centered-metrics.html">Google的用户体验评价方案</a>只是提供了简单的分析思路，但是没有到具体的点，这篇文章可以弥补这个缺憾。</p>
<p><strong>Facebook 的</strong><strong>产品设计五维</strong></p>
<p>情感</p>
<ol>
<li>精准定位——设计对受众定位清晰，符合该设计目标用户群的使用体验。</li>
<li>亲和力——所有交互元素的设计上，用户对信息沟通顺畅，感觉似有人一般的亲和感。</li>
<li>分享——承载对Facebook连接、自由、生活的文化认同。</li>
<li>留恋度——给人超出想象的空间，让人留恋往返，对产品期待更多，得到二次访问。</li>
</ol>
<p>易用</p>
<ol>
<li>反馈及时——在交互过程中，用户的操作能够在屏幕上及时得到反馈效果，帮助用户提高效率。</li>
<li>方位清晰——清晰的知道自己在那里，退路在那里，能够去那里。</li>
<li>路径简短——完成任务在尽可能控制在三步之内，完成某项任务所花废的步骤和时间最短最好。</li>
<li>容错性好——设计限制因素，突出正确操作，隐藏可能的错误操作，减少勿操作。</li>
</ol>
<p>形美</p>
<ol>
<li>文字悦读——信息传达易读，符合中文阅读习惯，信息传达快速。</li>
<li>颜色合适——利用大众对颜色理解的寓意，使用正确的色彩加强产品的印象。</li>
<li>布局美观——均衡与对称的构图，使画面整体具有稳定性。</li>
<li>空间感强——运用几何透视的原理，设计中表现远近、层次、穿插等关系。</li>
</ol>
<p>气势</p>
<ol>
<li>专业性——细节完美，找不到明显的设计瑕疵。</li>
<li>整体性——所有交互元素的设计上，用户对信息沟通顺畅，感觉似有人一般的亲和感。</li>
<li>品牌成分——体现Facebook品牌形象，并使品牌资产保持延续与统一。</li>
<li>惊喜度——局部设计有贴心且另人惊喜的体验。</li>
</ol>
<p>创新</p>
<ol>
<li>共性——符合已知事物的普遍认知。</li>
<li>异性——在共性基础上，给人耳目一新的感受。</li>
<li>复制性——能够促进Facebook其它产品的发展。</li>
<li>颠覆性——在互联网上前所未见，能够变成同行业新的标准。</li>
</ol>
<p>以上的五维可以说是面面俱到，从逻辑上将可以很好的辨别一个功能和页面到底用户体验如何，基于这样的标准，接下来就是按照标准进行评价了，为了评分更加公正，可以进行内部评分和外部评分来进行区分来达到最好的效果。</p>
<p><strong>产品设计内部评审规则</strong></p>
<p>评价周期</p>
<ol>
<li>每个设计师每个月被评审1次。</li>
<li>Team leader每周组织一次评审，提前通知设计师。</li>
</ol>
<p>人员组成</p>
<ol>
<li>大评委1人(组织本次评审者，由产品设计主管担任)</li>
<li>评委4人以上（部门经理1 人、主管1人、同事1人、其它。）</li>
<li>被评设计师</li>
</ol>
<p>评审流程</p>
<ol>
<li>每次由被评设计师自行上报一个最近上线的作品。</li>
<li>会议形式，被评设计师向评委团进行设计理念简单介绍。</li>
<li>评委各自填写评审表，完成后交由大评委。</li>
<li>大评委对评审表进行数据计算，意见汇总，并制作评审报告。</li>
<li>组长负责每次新改版上线的用户数据收集。</li>
<li>保留好原始评审表，进行存档。</li>
<li>打印评审报告，并将评审意见告诉设计师，完成本次评审。</li>
</ol>
<p>打分规则</p>
<ol>
<li>产品设计五大指标总共20条，每一条进行0-5分的打分，如果全部满意即为100分。</li>
<li>单条如果打5分，必须写出理由。打0-4分可以不写理由。</li>
<li>计分时，去掉一个最高分和一个最低分，剩下的分数相加后的平均即为最后得分。</li>
<li>根据线上用户调查数据和评委打分各占50%，最后得出该设计的最终得分。</li>
</ol>
<p><strong>产品设计外部评审规则</strong></p>
<p>线上用户调研也是用Facebook的产品设计五维去做，但不能用评委的版本，否则收集不到任何有用的信息。用户版只从情感、易用、形美、气势、创新五个大维度出题，不需要细化了，并且选项不能有任何引导性。而文字造成不要使用专业术语，用网友常用的网络用语就可以了。</p>
<p>产品设计用户在线调查问卷</p>
<p>1、您对新XXX的整体满意度如何？(情感)</p>
<p>A 非常满意  B 比较满意  C 一般  D 比较不满意  E 非常不满意</p>
<p>2、您觉得XXX是否好看？(形美)</p>
<p>A 漂亮，太棒了  B 还可 C 一般  D 有点难看  E 恶心，不想再看第二次</p>
<p>3、您认为XXX使用起来怎么样？(易用)</p>
<p>A 更清晰了，方便使用  B 还可以  C没什么感觉  D不如原来方便 E太费劲了</p>
<p>4、您认为新XXX功能怎么样？(气势)</p>
<p>A太棒了，我喜欢  B还可以  C一般  D有点多余  E完全多余的</p>
<p>5、您认为对新XXX的功能XXX怎么样？(创新)</p>
<p>A非常有用，太好了  B比较有用  C一般  D不关注  E对我没什么用</p>
<p>Facebook产品设计五维最终呈现给设计师的是图标化评审报告，不仅能知道设计师在团队中的水平，还能知道具体在那方面做的好，那方面有提高的空间，指导意义远远大于分数的意义。</p>
<p>以下为来自19楼的两份资料：<a href="http://vdisk.weibo.com/s/rH82">产品设计评审模型&amp; 产品设计评委打分表</a></p>
<p>原文链接：<a href="http://blog.19ued.com/?p=1144">http://blog.19ued.com/?p=1144</a></p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.biaodianfu.com/facebook-five-dimensional-design-model.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Facebook的系统架构</title>
		<link>http://www.biaodianfu.com/facebook-architecture.html</link>
		<comments>http://www.biaodianfu.com/facebook-architecture.html#comments</comments>
		<pubDate>Fri, 03 Jun 2011 02:43:52 +0000</pubDate>
		<dc:creator>标点符</dc:creator>
				<category><![CDATA[服务器]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[架构]]></category>

		<guid isPermaLink="false">http://www.biaodianfu.com/?p=3805</guid>
		<description><![CDATA[根据我现有的阅读和谈话，我所理解的今天Facebook的架构如下：   Web 前端是由 PHP 写的。Facebook 的 HipHop [1] 会把PHP转成 C++ 并用 g++编译，这样就可以为模板和Web逻贺业务层提供高的性能。 业务逻辑以Service的形式存在，其使用Thrift [2]。这些Service根据需求的不同由PHP，C++或Java实现（也可以用到了其它的一些语言……） 用Java写的Services没有用到任何一个企业级的应用服务器，但用到了Facebook自己的定制的应用服务器。看上去好像是重新发明轮子，但是这些Services只被暴露给Thrift使用（绝大所数是这样），Tomcat太重量级了，即使是Jetty也可能太过了点，其附加值对Facebook所需要的没有意义。 持久化由MySQL, Memcached [3], Facebook 的 Cassandra [4], Hadoop 的 HBase [5] 完成。Memcached 使用了MySQL的内存Cache。Facebook 工程师承认他们的Cassandra 使用正在减少，因为他们更喜欢HBase，因为它的更简单的一致性模型，以到其MapReduce能力。 离线处理使用Hadoop 和 Hive。 日志，点击，feeds数据使用Scribe [6]，把其聚合并存在 HDFS，其使用Scribe-HDFS [7]，因而允许使用MapReduce进行扩展分析。 BigPipe [8] 是他们的定制技术，用来加速页面显示。 Varnish Cache [9]用作HTTP代理。他们用这个的原因是高速和有效率。 [10]. 用来搞定用户上传的十亿张照片的存储，其由Haystack处理，Facebook自己开发了一个Ad-Hoc存储方案，其主要做了一些低层优化和“仅追加”写技术 [11]. Facebook Messages 使用了自己的架构，其明显地构建在了一个动态集群的基础架构上。业务逻辑和持久化被封装在一个所谓的’Cell’。每个‘Cell’都处理一部分用户，新的‘Cell’可以因为访问热度被添加[12]。 持久化归档使用HBase [13]。 Facebook Messages 的搜索引擎由存储在HBase中的一个倒置索引的构建。 [14] [...]]]></description>
			<content:encoded><![CDATA[<p><strong>根据我现有的阅读和谈话，我所理解的今天Facebook的架构如下：</strong></p>
<p> <img class="alignnone size-full wp-image-3810" title="facebook-architecture" src="http://www.biaodianfu.com/wp-content/uploads/2011/06/facebook-architecture.jpg" alt="" width="500" height="283" /></p>
<ul>
<li>Web 前端是由 PHP 写的。Facebook 的 <a href="http://developers.facebook.com/blog/post/358" target="_blank">HipHop </a>[1] 会把PHP转成 C++ 并用 g++编译，这样就可以为模板和Web逻贺业务层提供高的性能。</li>
<li>业务逻辑以Service的形式存在，其使用<a href="http://thrift.apache.org/" target="_blank">Thrift </a>[2]。这些Service根据需求的不同由PHP，C++或Java实现（也可以用到了其它的一些语言……）</li>
<li>用Java写的Services没有用到任何一个企业级的应用服务器，但用到了Facebook自己的定制的应用服务器。看上去好像是重新发明轮子，但是这些Services只被暴露给Thrift使用（绝大所数是这样），Tomcat太重量级了，即使是Jetty也可能太过了点，其附加值对Facebook所需要的没有意义。</li>
<li>持久化由MySQL, <a href="http://memcached.org/" target="_blank">Memcached </a>[3], Facebook 的 <a href="http://cassandra.apache.org/" target="_blank">Cassandra </a>[4], Hadoop 的 <a href="http://hbase.apache.org/" target="_blank">HBase </a>[5] 完成。Memcached 使用了MySQL的内存Cache。Facebook 工程师承认他们的Cassandra 使用正在减少，因为他们更喜欢HBase，因为它的更简单的一致性模型，以到其MapReduce能力。</li>
<li>离线处理使用Hadoop 和 Hive。</li>
<li>日志，点击，feeds数据使用<a href="https://github.com/facebook/scribe" target="_blank">Scribe </a>[6]，把其聚合并存在 HDFS，其使用<a href="http://hadoopblog.blogspot.com/2009/06/hdfs-scribe-integration.html" target="_blank">Scribe-HDFS </a>[7]，因而允许使用MapReduce进行扩展分析。</li>
<li><a href="http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919" target="_blank">BigPipe </a>[8] 是他们的定制技术，用来加速页面显示。</li>
<li><a href="http://www.varnish-cache.org/" target="_blank">Varnish Cache</a> [9]用作HTTP代理。他们用这个的原因是<a href="http://www.varnish-software.com/customers/facebook" target="_blank">高速和有效率</a>。 [10].</li>
<li>用来搞定用户<a href="http://www.facebook.com/note.php?note_id=76191543919" target="_blank">上传的十亿张照片的存储</a>，其由Haystack处理，Facebook自己开发了一个Ad-Hoc存储方案，其主要做了一些低层优化和“仅追加”写技术 [11].</li>
<li>Facebook Messages 使用了自己的架构，其明显地构建在了一个动态集群的基础架构上。业务逻辑和持久化被封装在一个所谓的’Cell’。每个‘Cell’都处理一部分用户，新的‘Cell’可以因为访问热度被添加[12]。 持久化归档使用HBase [13]。</li>
<li>Facebook Messages 的搜索引擎由存储在HBase中的一个倒置索引的构建。 [14]</li>
<li>Facebook 搜索引擎实现细节据我所知目前是未知状态。</li>
<li>Typeahead 搜索使用了一个定制的存储和检索逻辑。 [15]</li>
<li>Chat 基于一个Epoll 服务器，这个服务器由Erlang 开发，由Thrift存取 [16]</li>
</ul>
<p><strong>关于那些供给给上述组件的资源，下面是一些信息和数量，但是有一些是未知的：</strong></p>
<ul>
<li>Facebook估计有超过60,000 台服务器[16]。他们最新的数据中心在俄勒冈州的Prineville，其基于完全自定设计的硬件[17] 那是最近才公开的 <a href="http://opencompute.org/" target="_blank">Open Compute 项目</a>[18]。</li>
<li>300 TB 的数据存在 Memcached 中处理 [19]</li>
<li>他们的Hadoop 和 Hive 集群由3000 服务器组成，每台服务器有8个核，32GB的内存，12TB的硬盘，全部有2万4千个CPU的核，96TB内存和36PB的硬盘。 [20]</li>
<li>每天有1000亿的点击量，500亿张照片， 3 万亿个对象被 Cache，每天130TB的日志（<a href="http://www.facebook.com/note.php?note_id=409881258919" target="_blank">2010年7月的数据</a>） [21]</li>
</ul>
<p><strong>参考引用</strong><br />
[1] <em>HipHop for PHP</em>: <a href="http://developers.facebook.com/blog/post/358">http://developers.facebook.com/blog/post/358</a><br />
[2] <em>Thrift</em>: <a href="http://thrift.apache.org/">http://thrift.apache.org/</a><br />
[3] <em>Memcached</em>: <a href="http://memcached.org/">http://memcached.org/</a><br />
[4] <em>Cassandra</em>: <a href="http://cassandra.apache.org/">http://cassandra.apache.org/</a><br />
[5] <em>HBase</em>: <a href="http://hbase.apache.org/">http://hbase.apache.org/</a><br />
[6] <em>Scribe</em>: <a href="https://github.com/facebook/scribe">https://github.com/facebook/scribe</a><br />
[7] <em>Scribe-HDFS</em>: <a href="http://hadoopblog.blogspot.com/2009/06/hdfs-scribe-integration.html">http://hadoopblog.blogspot.com/2009/06/hdfs-scribe-integration.html</a><br />
[8] <em>BigPipe</em>: <a href="http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919">http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919</a><br />
[9] <em>Varnish Cache</em>: <a href="http://www.varnish-cache.org/">http://www.varnish-cache.org/</a><br />
[10] <em>Facebook goes for Varnish</em>: <a href="http://www.varnish-software.com/customers/facebook">http://www.varnish-software.com/customers/facebook</a><br />
[11] <em>Needle in a haystack</em>: efficient storage of billions of photos: <a href="http://www.facebook.com/note.php?note_id=76191543919">http://www.facebook.com/note.php?note_id=76191543919</a><br />
[12] <em>Scaling the Messages Application Back End</em>: <a href="http://www.facebook.com/note.php?note_id=10150148835363920">http://www.facebook.com/note.php?note_id=10150148835363920</a><br />
[13] <em>The Underlying Technology of Messages</em>: <a href="https://www.facebook.com/note.php?note_id=454991608919">https://www.facebook.com/note.php?note_id=454991608919</a><br />
[14] <em>The Underlying Technology of Messages Tech Talk</em>: <a href="http://www.facebook.com/video/video.php?v=690851516105">http://www.facebook.com/video/video.php?v=690851516105</a><br />
[15] <em>Facebook’s typeahead search architecture</em>: <a href="http://www.facebook.com/video/video.php?v=432864835468">http://www.facebook.com/video/video.php?v=432864835468</a><br />
[16] <em>Facebook Chat</em>: <a href="http://www.facebook.com/note.php?note_id=14218138919">http://www.facebook.com/note.php?note_id=14218138919</a><br />
[17] <em>Who has the most Web Servers?</em>: <a href="http://www.datacenterknowledge.com/archives/2009/05/14/whos-got-the-most-web-servers/">http://www.datacenterknowledge.com/archives/2009/05/14/whos-got-the-most-web-servers/</a><br />
[18] B<em>uilding Efficient Data Centers with the Open Compute Project</em>: <a href="http://www.facebook.com/note.php?note_id=10150144039563920">http://www.facebook.com/note.php?note_id=10150144039563920</a><br />
[19] <em>Open Compute Project</em>: <a href="http://opencompute.org/">http://opencompute.org/</a><br />
[20] <em>Facebook’s architecture presentation at Devoxx 2010</em>: <a href="http://www.devoxx.com/">http://www.devoxx.com</a><br />
[21] <em>Scaling Facebook to 500 millions users and beyond</em>: <a href="http://www.facebook.com/note.php?note_id=409881258919">http://www.facebook.com/note.php?note_id=409881258919</a></p>
<p>本文由<a href="http://coolshell.cn/articles/4549.html">陈皓</a>翻译：原文出处：<a href="http://www.quora.com/What-is-Facebooks-architecture">http://www.quora.com/What-is-Facebooks-architecture</a></p>
<div id="__w2_fAOJne2_inline_editor_content">
<p><strong>What is Facebook&#8217;s architecture?</strong></p>
</div>
<p>From various readings and conversations I had, my understanding of Facebook&#8217;s current architecture is:</p>
<ul>
<li>Web front-end written in PHP. Facebook&#8217;s HipHop [1] then converts it to C++ and compiles it using g++, thus providing a high performance templating and Web logic execution layer</li>
<li>Business logic is exposed as services using Thrift [2]. Some of these services are implemented in PHP, C++ or Java depending on service requirements (some other languages are probably used&#8230;)</li>
<li>Services implemented in Java don&#8217;t use any usual enterprise application server but rather use Facebook&#8217;s custom application server. At first this can look as wheel reinvented but as these services are exposed and consumed only (or mostly) using Thrift, the overhead of Tomcat, or even Jetty, was probably too high with no significant added value for their need.</li>
<li>Persistence is done using MySQL, Memcached [3], Facebook&#8217;s Cassandra [4], Hadoop&#8217;s HBase [5]. Memcached is used as a cache for MySQL as well as a general purpose cache. Facebook engineers admit that their use of Cassandra is currently decreasing as they now prefer HBase for its simpler consistency model and its MapReduce ability.</li>
<li>Offline processing is done using Hadoop and Hive</li>
<li>Data such as logging, clicks and feeds transit using Scribe [6] and are aggregating and stored in HDFS using Scribe-HDFS [7], thus allowing extended analysis using MapReduce</li>
<li>BigPipe [8] is their custom technology to accelerate page rendering using a pipelining logic</li>
<li>Varnish Cache [9] is used for HTTP proxying. They&#8217;ve prefered it for its high performance and efficiency [10].</li>
<li>The storage of the billions of photos posted by the users is handled by Haystack, an ad-hoc storage solution developed by Facebook which brings low level optimizations and append-only writes [11].</li>
<li>Facebook Messages is using its own architecture which is notably based on infrastructure sharding and dynamic cluster management. Business logic and persistence is encapsulated in so-called &#8216;Cell&#8217;. Each Cell handles a part of users ; new Cells can be added as popularity grows [12]. Persistence is achieved using HBase [13].</li>
<li>Facebook Messages&#8217; search engine is built with an inverted index stored in HBase [14]</li>
<li>Facebook Search Engine&#8217;s implementation details are unknown as far as I know</li>
<li>The typeahead search uses a custom storage and retrieval logic [15]</li>
<li>Chat is based on an Epoll server developed in Erlang and accessed using Thrift [16]</li>
</ul>
<p>About the resources provisioned for each of these components, some information and numbers are known:</p>
<ul>
<li>Facebook is estimated to own more than 60,000 servers [17]. Their recent datacenter in Prineville, Oregon is based on entirely self-designed hardware [18] that was recently unveiled as Open Compute Project [19].</li>
<li>300 TB of data is stored in Memcached processes [20]</li>
<li>Their Hadoop and Hive cluster is made of 3000 servers with 8 cores, 32 GB RAM, 12 TB disks that is a total of 24k cores, 96 TB RAM and 36 PB disks [20]</li>
<li>100 billion hits per day, 50 billion photos, 3 trillion objects cached, 130 TB of logs per day as of july 2010 [21]</li>
</ul>
<p>[1] <em>HipHop for PHP</em>: <a rel="nofollow" href="http://developers.facebook.com/blog/post/358" target="_blank">http://developers.facebook.com/b&#8230;</a><br />
[2] <em>Thrift</em>: <a rel="nofollow" href="http://thrift.apache.org/" target="_blank">http://thrift.apache.org/</a><br />
[3] <em>Memcached</em>: <a rel="nofollow" href="http://memcached.org/" target="_blank">http://memcached.org/</a><br />
[4] <em>Cassandra</em>: <a rel="nofollow" href="http://cassandra.apache.org/" target="_blank">http://cassandra.apache.org/</a><br />
[5] <em>HBase</em>: <a rel="nofollow" href="http://hbase.apache.org/" target="_blank">http://hbase.apache.org/</a><br />
[6] <em>Scribe</em>: <a rel="nofollow" href="https://github.com/facebook/scribe" target="_blank">https://github.com/facebook/scribe</a><br />
[7] <em>Scribe-HDFS</em>: <a rel="nofollow" href="http://hadoopblog.blogspot.com/2009/06/hdfs-scribe-integration.html" target="_blank">http://hadoopblog.blogspot.com/2&#8230;</a><br />
[8] <em>BigPipe</em>: <a rel="nofollow" href="http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919" target="_blank">http://www.facebook.com/notes/fa&#8230;</a><br />
[9] <em>Varnish Cache</em>: <a rel="nofollow" href="http://www.varnish-cache.org/" target="_blank">http://www.varnish-cache.org/</a><br />
[10] <em>Facebook goes for Varnish</em>: <a rel="nofollow" href="http://www.varnish-software.com/customers/facebook" target="_blank">http://www.varnish-software.com/&#8230;</a><br />
[11] <em>Needle in a haystack</em>: efficient storage of billions of photos: <a rel="nofollow" href="http://www.facebook.com/note.php?note_id=76191543919" target="_blank">http://www.facebook.com/note.php&#8230;</a><br />
[12] <em>Scaling the Messages Application Back End</em>: <a rel="nofollow" href="http://www.facebook.com/note.php?note_id=10150148835363920" target="_blank">http://www.facebook.com/note.php&#8230;</a><br />
[13] <em>The Underlying Technology of Messages</em>: <a rel="nofollow" href="https://www.facebook.com/note.php?note_id=454991608919" target="_blank">https://www.facebook.com/note.ph&#8230;</a><br />
[14] <em>The Underlying Technology of Messages Tech Talk</em>: <a rel="nofollow" href="http://www.facebook.com/video/video.php?v=690851516105" target="_blank">http://www.facebook.com/video/vi&#8230;</a><br />
[15] <em>Facebook&#8217;s typeahead search architecture</em>: <a rel="nofollow" href="http://www.facebook.com/video/video.php?v=432864835468" target="_blank">http://www.facebook.com/video/vi&#8230;</a><br />
[16] <em>Facebook Chat</em>: <a rel="nofollow" href="http://www.facebook.com/note.php?note_id=14218138919" target="_blank">http://www.facebook.com/note.php&#8230;</a><br />
[17] <em>Who has the most Web Servers?</em>: <a rel="nofollow" href="http://www.datacenterknowledge.com/archives/2009/05/14/whos-got-the-most-web-servers/" target="_blank">http://www.datacenterknowledge.c&#8230;</a><br />
[18] B<em>uilding Efficient Data Centers with the Open Compute Project</em>: <a rel="nofollow" href="http://www.facebook.com/note.php?note_id=10150144039563920" target="_blank">http://www.facebook.com/note.php&#8230;</a><br />
[19] <em>Open Compute Project</em>: <a rel="nofollow" href="http://opencompute.org/" target="_blank">http://opencompute.org/</a><br />
[20] <em>Facebook&#8217;s architecture presentation at Devoxx 2010</em>: <a rel="nofollow" href="http://www.devoxx.com/" target="_blank">http://www.devoxx.com</a><br />
[21] <em>Scaling Facebook to 500 millions users and beyond</em>: <a rel="nofollow" href="http://www.facebook.com/note.php?note_id=409881258919" target="_blank">http://www.facebook.com/note.php&#8230;</a></p>
<p>Related posts:<ol>
<li><a href='http://www.biaodianfu.com/facebook-xhp.html' rel='bookmark' title='Facebook XHP:让PHP成为模板引擎'>Facebook XHP:让PHP成为模板引擎</a></li>
<li><a href='http://www.biaodianfu.com/facebook-hiphop.html' rel='bookmark' title='Facebook HipHop 源代码发布'>Facebook HipHop 源代码发布</a></li>
<li><a href='http://www.biaodianfu.com/facebook-efficient-storage-of-billions-of-photos.html' rel='bookmark' title='Facebook图片存储架构的学习'>Facebook图片存储架构的学习</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.biaodianfu.com/facebook-architecture.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook XHP:让PHP成为模板引擎</title>
		<link>http://www.biaodianfu.com/facebook-xhp.html</link>
		<comments>http://www.biaodianfu.com/facebook-xhp.html#comments</comments>
		<pubDate>Thu, 22 Jul 2010 22:54:44 +0000</pubDate>
		<dc:creator>标点符</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Facebook]]></category>

		<guid isPermaLink="false">http://www.biaodianfu.com/?p=2331</guid>
		<description><![CDATA[继HipHop之后，Facebook推出的又一重要PHP改进项目XHP。根据Github上项目的文档，XHP是一个PHP扩展，通过它，开发人员可以直接在PHP代码中内嵌XML文档片段，作为合法的PHP表达式。这样，PHP就成为一个更为严格的模板引擎，大大简化了实现可重用组件的工作。 比如这样的简单代码示例： &#60;?php rquire “xphsrc/php-lib/init.php”; $href = &#8216;http://www.facebook.com&#8217;; echo &#60;a href={$href}&#62;Facebook&#60;/a&#62; 第三行代码中的语法，其中echo后的不是字符串。 XHP不仅使前端代码更容易理解，还有助于防止跨站脚本攻击。事实上，Facebook Lite网站（快速简化版本的Facebook）就是完全用XHP写成的。 源代码地址：http://wiki.github.com/facebook/xhp/ Related posts: Facebook HipHop 源代码发布 在Windows上安装配置Redis及Python使用 phpQuery:像jQuery一样处理DOM]]></description>
			<content:encoded><![CDATA[<p>继HipHop之后，Facebook推出的又一重要PHP改进项目XHP。根据<a href="http://wiki.github.com/facebook/xhp/" target="_blank">Github上项目的文档</a>，XHP是一个PHP扩展，通过它，开发人员可以直接在PHP代码中内嵌XML文档片段，作为合法的PHP表达式。这样，PHP就成为一个更为严格的模板引擎，大大简化了实现可重用组件的工作。</p>
<p>比如这样的简单代码示例：</p>
<blockquote><p>&lt;?php</p>
<p>rquire “xphsrc/php-lib/init.php”;</p>
<p>$href = &#8216;http://www.facebook.com&#8217;;</p>
<p>echo &lt;a href={$href}&gt;Facebook&lt;/a&gt;</p></blockquote>
<p>第三行代码中的语法，其中echo后的不是字符串。 XHP不仅使前端代码更容易理解，还有助于防止跨站脚本攻击。事实上，Facebook Lite网站（快速简化版本的Facebook）就是完全用XHP写成的。</p>
<p>源代码地址：<a href="http://wiki.github.com/facebook/xhp/">http://wiki.github.com/facebook/xhp/</a></p>
<p>Related posts:<ol>
<li><a href='http://www.biaodianfu.com/facebook-hiphop.html' rel='bookmark' title='Facebook HipHop 源代码发布'>Facebook HipHop 源代码发布</a></li>
<li><a href='http://www.biaodianfu.com/windows-redis-python.html' rel='bookmark' title='在Windows上安装配置Redis及Python使用'>在Windows上安装配置Redis及Python使用</a></li>
<li><a href='http://www.biaodianfu.com/phpquery.html' rel='bookmark' title='phpQuery:像jQuery一样处理DOM'>phpQuery:像jQuery一样处理DOM</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.biaodianfu.com/facebook-xhp.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook HipHop 源代码发布</title>
		<link>http://www.biaodianfu.com/facebook-hiphop.html</link>
		<comments>http://www.biaodianfu.com/facebook-hiphop.html#comments</comments>
		<pubDate>Sun, 21 Feb 2010 06:23:10 +0000</pubDate>
		<dc:creator>标点符</dc:creator>
				<category><![CDATA[服务器]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.biaodianfu.com/?p=1813</guid>
		<description><![CDATA[Facebook HipHop for PHP是一个PHP到C++的转换程序，一个重新实现的PHP运行库，和许多常用PHP扩展的重写版本构成。使PHP能和C++一样高效的运行。HipHop使Facebook Web服务器上的CPU使用平均减少了50%。  PHP是一种脚本语言，其好处是编程效率高，能够支持产品的快速迭代。但是与传统的编译语言相比，脚本语言的CPU和内存使用效率不好。随着Ajax技术的广泛采用，加上SNS对动态要求较高，这些缺点更显得突出。常见的办法是直接用C++重写PHP应用中比较复杂的部分，作为PHP扩展。     HipHop将PHP代码转换为高度优化的C++代码，然后再用g++编译器编译。它可以保持语义等效地执行源代码，但为了提高性能，牺牲了一些很少用到的特性，比如eval()。  HipHop开发中的主要困难在于，在PHP和C++这两种很不一样的语言之间怎么实现转换。虽然PHP也可以写一些很巧妙的动态特性，但是大多数PHP代码还是非常简单的。if (&#8230;) {&#8230;} else {..} 比foo($x) { include $x; } 肯定更常见。这为性能提高提供了机会。HipHop生成的代码尽可能地使用函数和变量的静态绑定。同时，还使用类型推演来选出变量最可能对应的某个类型，从而节省内存。  转换过程分三步：  1. 静态分析。收集声明关系和依赖关系等信息。  2. 类型推演。选择最合适的类型，是C++的标量？还是String, Array, classes, Object或者Variant。  3. 代码生成。大部分直接将PHP语句和表达式对应为C++的语句和表达式。  HipHop在保持了PHP优点的同时，也兼得了C++的性能优势。项目总共有30万行代码，5000多个单元测试。所有这些都以PHP开源许可证形式发布到GitHub。  http://github.com/facebook/hiphop-php Related posts: Facebook XHP:让PHP成为模板引擎 Facebook的系统架构 国内搜索引擎关键词的解析方法]]></description>
			<content:encoded><![CDATA[<p>Facebook HipHop for PHP是一个PHP到C++的转换程序，一个重新实现的PHP运行库，和许多常用PHP扩展的重写版本构成。使PHP能和C++一样高效的运行。HipHop使Facebook Web服务器上的CPU使用平均减少了50%。 </p>
<p>PHP是一种脚本语言，其好处是编程效率高，能够支持产品的快速迭代。但是与传统的编译语言相比，脚本语言的CPU和内存使用效率不好。随着Ajax技术的广泛采用，加上SNS对动态要求较高，这些缺点更显得突出。常见的办法是直接用C++重写PHP应用中比较复杂的部分，作为PHP扩展。 </p>
<p><strong> </strong> </p>
<p>HipHop将PHP代码转换为高度优化的C++代码，然后再用g++编译器编译。它可以保持语义等效地执行源代码，但为了提高性能，牺牲了一些很少用到的特性，比如eval()。 </p>
<p>HipHop开发中的主要困难在于，在PHP和C++这两种很不一样的语言之间怎么实现转换。虽然PHP也可以写一些很巧妙的动态特性，但是大多数PHP代码还是非常简单的。if (&#8230;) {&#8230;} else {..} 比foo($x) { include $x; } 肯定更常见。这为性能提高提供了机会。HipHop生成的代码尽可能地使用函数和变量的静态绑定。同时，还使用类型推演来选出变量最可能对应的某个类型，从而节省内存。 </p>
<p>转换过程分三步： </p>
<p>1. 静态分析。收集声明关系和依赖关系等信息。 </p>
<p>2. 类型推演。选择最合适的类型，是C++的标量？还是String, Array, classes, Object或者Variant。 </p>
<p>3. 代码生成。大部分直接将PHP语句和表达式对应为C++的语句和表达式。 </p>
<p>HipHop在保持了PHP优点的同时，也兼得了C++的性能优势。项目总共有30万行代码，5000多个单元测试。所有这些都以PHP开源许可证形式发布到GitHub。 </p>
<p><a href="http://github.com/facebook/hiphop-php">http://github.com/facebook/hiphop-php</a></p>
<p>Related posts:<ol>
<li><a href='http://www.biaodianfu.com/facebook-xhp.html' rel='bookmark' title='Facebook XHP:让PHP成为模板引擎'>Facebook XHP:让PHP成为模板引擎</a></li>
<li><a href='http://www.biaodianfu.com/facebook-architecture.html' rel='bookmark' title='Facebook的系统架构'>Facebook的系统架构</a></li>
<li><a href='http://www.biaodianfu.com/get-search-engine-keywords.html' rel='bookmark' title='国内搜索引擎关键词的解析方法'>国内搜索引擎关键词的解析方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.biaodianfu.com/facebook-hiphop.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

