作为140个字的缔造者,twitter太简单了,又太复杂了,简单是因为仅仅用140个字居然使有几次世界性事件的传播速度超过任何媒体,复杂是因为要为2亿用户提供这看似简单的140个字的服务,这真的是因为简单,所以复杂。可是比较遗憾的是目前在中国大陆twitter是无法访问的,但作为一个爱好架构的程序猿,这道墙是必须得翻的,墙外的世界更精彩。今天就结合网络上的一些资料,来浅谈一下我对twitter网站架构的学习体会,希望给路过的朋友一点启示.......
一、twitter网站基本情况概览
- 截至2011年4月,twitter的注册用户约为1.75亿,并以每天300000的新用户注册数增长,但是其真正的活跃用户远远小于这个数目,大部分注册用户都是没有关注者或没有关注别人的,这也是与facebook的6亿活跃用户不能相提并论的。
- twitter每月有180万独立访问用户数,并且75%的流量来自twitter.com以外的网站。每天通过API有30亿次请求,每天平均产生5500次tweet,37%活跃用户为手机用户,约60%的tweet来自第三方的应用。
- 平台:Ruby on Rails 、Erlang 、MySQL 、Mongrel 、Munin 、Nagios 、Google Analytics 、AWStats 、Memcached
下图是twitter的整体架构设计图:
二、twitter的平台
twitter平台大致由twitter.com、手机以及第三方应用构成,如下图所示:
其中流量主要以手机和第三方为主要来源。
- Ruby on Rails:web应用程序的框架
- Erlang:通用的面向并发的编程语言,开源项目地址:http://www.erlang.org/
- AWStats:实时日志分析系统:开源项目地址:http://awstats.sourceforge.net/
- Memcached:分布式内存缓存组建
- Starling:Ruby开发的轻量级消息队列
- Varnish:高性能开源HTTP加速器
- Kestrel:scala编写的消息中间件,开源项目地址:http://github.com/robey/kestrel
- Comet Server:Comet是一种ajax长连接技术,利用Comet可以实现服务器主动向web浏览器推送数据,从而避免客户端的轮询带来的性能损失。
- libmemcached:一个memcached客户端
- 使用mysql数据库服务器
- Mongrel:Ruby的http服务器,专门应用于rails,开源项目地址:http://rubyforge.org/projects/mongrel/
- Munin:服务端监控程序,项目地址:http://munin-monitoring.org/
- Nagios:网络监控系统,项目地址:http://www.nagios.org/
三、缓存
讲着讲着就又说到缓存了,确实,缓存在大型web项目中起到了举足轻重的作用,毕竟数据越靠近CPU存取速度越快。下图是twitter的缓存架构图:
大量使用memcached作缓存
- 例如,如果获得一个count非常慢,你可以将count在1毫秒内扔入memcached
- 获取朋友的状态是很复杂的,这有安全等其他问题,所以朋友的状态更新后扔在缓存里而不是做一个查询。不会接触到数据库
- ActiveRecord对象很大所以没有被缓存。Twitter将critical的属性存储在一个哈希里并且当访问时迟加载
- 90%的请求为API请求。所以在前端不做任何page和fragment缓存。页面非常时间敏感所以效率不高,但Twitter缓存了API请求
在memcached缓存策略中,又有所改进,如下所述:
1、创建一个直写式向量缓存Vector Cache,包含了一个tweet ID的数组,tweet ID是序列化的64位整数,命中率是99%
2、加入一个直写式行缓存Row Cache,它包含了数据库记录:用户和tweets。这一缓存有着95%的命中率。
3、引入了一个直读式的碎片缓存Fragmeng Cache,它包含了通过API客户端访问到的sweets序列化版本,这些sweets可以被打包成json、xml或者Atom格式,同样也有着95%的命中率。
4、为页面缓存创建一个单独的缓存池Page Cache。该页面缓存池使用了一个分代的键模式,而不是直接的实效。
四、消息队列
- 大量使用消息。生产者生产消息并放入队列,然后分发给消费者。Twitter主要的功能是作为不同形式(SMS,Web,IM等等)之间的消息桥
- 使用DRb,这意味着分布式Ruby。有一个库允许你通过TCP/IP从远程Ruby对象发送和接收消息,但是它有点脆弱
- 移到Rinda,它是使用tuplespace模型的一个分享队列,但是队列是持久的,当失败时消息会丢失
- 尝试了Erlang
- 移到Starling,用Ruby写的一个分布式队列
- 分布式队列通过将它们写入硬盘用来挽救系统崩溃。其他大型网站也使用这种简单的方式
五、总结
1、数据库一定要进行合理索引
2、要尽可能快的认知你的系统,这就要你能灵活地运用各种工具了
3、缓存,缓存,还是缓存,缓存一切可以缓存的,让你的应用飞起来。
相关推荐
解剖Twitter的系统架构,揭示Twitter使用的共享软件;了解Twitter如何处理多并发、冲突事件的处理方法;
系统架构学习 参考文献 Twitter系统架构设计分析
Twitter 的核心架构设计分析 Twitter 作为一家互联网服务提供商,在建设通信软件服务时遇到的网络问题、软件系统架构问题、软件技术选型等等都值得我们学习。 Twitter 的核心架构设计分析可以帮助读者从整体理解...
### Twitter系统架构设计分析 #### 一、万事开头易——核心业务逻辑与初期架构 **1.1 核心业务逻辑** Twitter的核心业务逻辑主要基于两大功能:Following(关注)和Be followed(被关注)。当用户关注其他用户时...
在一个技术峰会上,他谈到了Twitter的架构,特别是在过去一年当中为提升Web站点性能所执行的优化。Twitter使用的大部分工具都是开源的。其结构是用Rails作前端,C,Scala和Java组成中间的业务层,使用MySQL存储数据...
twitter cache缓存架构图.png
,YouTube,MySpace,Twitter,国内如优酷网等大型网站的技术架构(本文重点分析优酷网的技术架构),以飨读者。本文着重凸显每一幅图的精彩之处与其背后含义,而图的说明性文字则从简从略。ok,好好享受此
Twitter 千万 QPS 分布式系统的架构设计和高效运维 从给定的文件信息中,我们可以获得以下知识点: 1. 分布式系统架构设计:文章讨论了 Twitter 千万 QPS 分布式系统的架构设计,涉及到数据系统的设计、存储类型、...
这篇分析将深入探讨Twitter的核心技术架构,以期为大型网站开发者提供宝贵的经验和启示。 一、分布式微服务架构 Twitter采用的是微服务架构,即将整个系统拆分为许多独立的小服务,每个服务都负责特定的功能,如...
- **Twitter基本架构与功能**:了解Twitter的基础设置和使用方法。 - **确定商业目标**:明确使用Twitter的目标,如品牌推广、客户服务等。 - **账户设置优化**:根据个人或企业需求定制Twitter账户。 - **社区...
Twitter API是一个基于RESTful架构的服务,提供了多种接口来获取、发送Twitter数据。Twitter4j通过封装这些接口,简化了API调用的过程,使得开发者无需直接处理HTTP请求和JSON解析,而是能用Java对象直接进行操作。 ...
在2016年的架构师峰会上,Twitter的软件工程师Yi Zhuang分享了有关Twitter搜索引擎演化的PPT,详细阐述了当前搜索引擎的规模、发展历程、完整推文索引的建立、搜索引擎的应用以及未来展望等方面的知识点。...
- **数据复制**:介绍了两种不同的数据复制机制——镜像集(Mirror Set)和Pod Balancer。 - **镜像集**:简单易用,但数据恢复速度较慢,适用于网络密集型而非I/O密集型场景。 - **Pod Balancer**:虽然数据恢复...
Hydra 架构介绍与分布式跟踪系统 Hydra 架构是为了解决大规模分布式集群中的服务调用跟踪问题而设计的。这种架构的开发初衷是为了支撑互联网应用的各种服务,通常这些服务都是由不同的团队开发、使用不同的编程语言...
本文将深入探讨Twitter的业务模式、编程语言选择、网站架构以及关键技术。 首先,让我们来看看Twitter的业务模式。Twitter的核心理念在于推动信息的即时分享,它打破了Web 1.0时代用户被动获取信息的传统,让用户...
对于开发者来说,它提供了一个学习和研究现代Android应用开发的宝贵资源,尤其是对于那些对Twitter API、Material Design以及Android应用架构感兴趣的开发者。 Talon for Twitter Android的应用程序结构可能包含...
该项目是一个使用Java编程语言,并基于Spring微服务架构实现的Twitter克隆应用。Spring微服务架构是一种将大型应用程序拆分为小型、独立的服务的方法,每个服务都可以独立开发、部署和扩展,从而提高了灵活性和可...
FaunaDB则是一个基于Twitter技术的全球分布式事务性数据库,特别适合需要高可用性和强一致性的应用。 Amazon Aurora Serverless是亚马逊提供的一个无服务器数据库服务,它支持MySQL和PostgreSQL,具有自动扩展能力...