谈谈Facebook的聊天系统架构
今天看到一份 Facebook 公司 2009 年的 Slideshow, 介绍它的聊天系统架构, 其中的一张图结构非常清晰, 所以我对这张图谈谈我的看法.
Web Tier: 用 PHP 开发, 聊天相关的业务逻辑代码. 如 AJAX 请求, HTML 页面拼接等. 这个模块整个其它的 3 个模块, 向浏览器提供了大部分的聊天接口.
Chatlogger, 用 C++ 开发, 消息的存储服务. 至少向 Web Tier 层提供了消息保存, 聊天历史消息, 最近联系人等基础服务接口.
Presence, 用 C++ 开发, 提供用户在线状态维护服务. 这些服务器会将在线的用户(UID)保存在内存中, 然后接受 Web Tier 的请求, 例如判断某个用户是否在线.
Channel(Comet) Cluster, 用 Erlang 开发, 提供基于浏览器的”Server Push(服务器推)”功能. 是对开源的 Mochiweb 的二次开发. 浏览器会跟 Channel Clusters 进行连接, 当 Web Tier 收到某个用户的消息时, 会通过 Channel Cluster 推送到接收者, 实现网页实时聊天功能.
关于 Web Tier, 其实没有太多的技术可讨论, 因为这主要是业务逻辑, 即使不用 PHP 语言, 用 Python 或者 Java 等都没有问题.
Chatlogger 虽然名字是”日志记录”, 但它不可能是简单的日志记录, 它必须要提供基本的消息服务接口. 而且, 为了存储数亿 Facebook 用户的聊天历史, 必然要涉及到海量数据存储. 这部分 Facebook 曾经用 Cassandra, 后来改为 HBase. Chatlogger 使用 C++ 进行开发是基于性能的考虑, 而且消息存储服务的接口比较固定, 不太可能经常变化.
Presence 维护用户的在线状态, 类似这种服务在网游中比较常见. Presence 服务器使用 C++ 来开发, 也是基于性能的考虑. 如果使用 HTTP + PHP + Memcache/Redis 这样的架构, 一是 PHP 代码执行性能损失很大, 二是 Memcache/Redis 是通用的存储方案, 不适合 Presence 的高性能需求. Presence 在数据全部保存在内存中, 速度快, 设计灵活. 注意, Presence 是一个被动服务器, 它并不主动向外推送消息, 这使得这样的服务器接口非常固定, 独立性很强. Presence 的数据主要来自于 Comet 群集的推送.
Channel(Comet) Cluster 和浏览器保持网络连接. Comet 有通道的概念, 每个用户对应一个通道, 用户会分布在不同的服务器上, 用户每打开一个新的浏览器标签, 就会同服务器建立一个新的网络连接, 但都是连到同一个通道. Comet 服务器是基于开源的 Erlang 服务器 Mochiweb 进行二次开发. 在身份验证和安全方面, 通道的建立是由 Web Tier 进行控制的, 这样如果用户没有在业务逻辑层经过相应的验证, 就直接连接 Comet 服务器, 它是会被拒绝的. 另外, Comet 服务器会在自己的内存中先维护一份在线用户列表, 然后定期更新到 Presence 服务器, 这也是二次开发的原因. 如果 Comet 服务器不自己先缓存一份在线用户列表, 那么用户频繁上线下线都立即通知 Presence 的话, 压力会非常大.
架构已经很清晰, 但要应用起来, 代码的开发是必不可少的. 当然, 不同的技术团队会根据技术情况进行取舍. 例如消息存储使用 MySQL, Presence 使用基于 Web 容器架构的技术来开发, 而 Comet 模块可以使用 nginx-push-stream. 不过, 仅仅依靠整合开源系统而不做二次开发, 不可能解决大问题.
PDF 文件可以在这里下载: http://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf
Related posts:
- 在线状态服务在网站系统中的应用 (11.095)
- Facebook 网站架构 (10.606)
- nginx-push-stream-module 笔记 (8.135)
- 使用 Channel 进行可靠传输 (8.01)
- Redis被bgsave和bgrewriteaof阻塞的解决方法 (7.729)
最先发表在: http://www.ideawu.net/blog/archives/728.html
Tags: Facebook
谈谈Facebook的聊天系统架构的更多相关文章
- 【转发】揭秘Facebook 的系统架构
揭底Facebook 的系统架构 www.MyException.Cn 发布于:2012-08-28 12:37:01 浏览:0次 0 揭秘Facebook 的系统架构 www.MyExcep ...
- 浅谈Facebook的服务器架构(组图)
导读:毫无疑问,作为全球最领先的社交网络,Facebook的高性能集群系统承担了海量数据的处理,它的服务器架构一直为业界众人所关注.CSDN博主yanghehong在他自己最新的一篇博客< Fa ...
- 浅谈Facebook的服务器架构
导读:毫无疑问,作为全球最领先的社交网络,Facebook的高性能集群系统承担了海量数据的处理,它的服务器架构一直为业界众人所关注.CSDN博主yanghehong在他自己最新的一篇博客< Fa ...
- Facebook 的系统架构(转)
来源:http://www.quora.com/What-is-Facebooks-architecture(由Micha?l Figuière回答) 根据我现有的阅读和谈话,我所理解的今天Faceb ...
- 谈谈 数据中心SOA 架构
为什么要讨论 数据中心SOA 架构呢? 请参考我写的另外一篇文章 <论 微服务 和 Entity Framework 对数据的割裂> https://www.cnblogs.com ...
- iOS开发之谈谈App应用的架构搭建(推荐给大家看)
1.iOS应用架构谈 开篇: 2.iOS应用架构谈 view层的组织和调用方案: 3.iOS应用架构谈 网络层设计方案: 4.iOS应用架构谈 本地持久化方案及动态部署: 5.iOS应用架构谈 组件化 ...
- Facebook Messenger的后台架构是什么样的?
后台的架构是由前台的需求决定的.做 mobile app 的需求跟做 web app 是不一样的,比如 mobile app 对实时性的要求比较强(移动用户都没耐性),移动设备网络不稳定(要能做到断点 ...
- Facebook没有测试工程师,如何进行质量控制的?
Facebook从04年的哈佛校园的学生项目在短短的7-8年的时间中快速增长为拥有10亿用户的世界上最大的社交网络,又一次见证了互联网创业成功的奇迹.同时它的产品研发流程也成为了众多互联网产品公司的追 ...
- Worktile 技术架构概要
其实早就该写这篇博客了,一直说忙于工作没有时间,其实时间挤挤总会有的,可能就是因为懒吧!从2013年11月一直拖到现在,今天就简单谈谈 Worktile 的技术架构吧 . Worktile 自上线到现 ...
随机推荐
- [ACM] POJ 2253 Frogger (最短路径变形,每条通路中的最长边的最小值)
Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 24879 Accepted: 8076 Descript ...
- LCM Cardinality
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=31675#problem/E 暴力 // File Name: uva10892.cpp ...
- Java 程序中的多线程
概述 synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C. D等)正在用这个方法,有的话要等正在使用synch ...
- java面试核心基础(1)
1.以下代码的执行结果 String s1 = "helloworld"; String s2 = "hello" + new Stirng("wor ...
- ASP.NET之电子商务系统开发-1(数据列表)
一.前言 首先声明的是,这是我第一个与别人合作的.net项目,另一个人做的是后台管理,我做的前台,这是一个电子商务的系统,主要实现的功能是查看商品以及购物功能. 二.开始 首先看一下我截取的项目部分商 ...
- zoj 1109 zoj 1109 Language of FatMouse(字典树)
好开心,手动自己按照字典树的思想用c写了一个优化后的trie字典树,就是用链表来代替26个大小的字符数组.完全按照自己按照自己的想法打的,没有参考如何被人的代码.调试了一天,居然最后错在一个小问题上, ...
- 火狐浏览器开始支持3D游戏和视屏通话
最近,Mozilla发布了第22版本的火狐浏览器,这个版本增加了对3D游戏.视频通话和文件分享功能的支持.现在使用者不必下载额外的插件或者第三方软件就可以使用上面的所有特性.为了鼓励更多的开发者为火狐 ...
- iOS 时钟动画
在iOS开发中,定时器NSTimer并不能够准确的出发,通常使用NSTimer只能控制不需要精确处理的操作,而CADisplayLink就是在每次屏幕刷新时,通知系统.CADisplayLink最大的 ...
- 浅谈Struts2(四)
一.Struts2的拦截器(Intercept) 作用:把多个Action中的共有代码,提取至拦截器,从而减少Action中的冗余代码. 1.Action拦截器 a.编写interceptor类 pu ...
- Android应用开发基础篇(11)-----ViewFlipper
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/01/2376067.html 一.概述 ViewFlipper这个部件是用来实现多页显示的,多页 ...