热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Twitter,架构的变迁

EvanWeaver是Twitter服务团队的总工程师,他的主要工作是优化与伸缩性。在QConLondon2009上,他谈到了Twitter的架构&#x

Evan Weaver是Twitter服务团队的总工程师,他的主要工作是优化与伸缩性。在QCon London 2009上,他谈到了Twitter的架构,特别是在过去一年当中为提升Web站点性能所执行的优化。

\u0026#xD;\n

Twitter使用的大部分工具都是开源的。其结构是用Rails作前端,C,Scala和Java组成中间的业务层,使用MySQL存储数据。所有的东西都保存在RAM里,而数据库只是用作备份。Rails前端处理展现,缓存组织,DB查询以及同步插入。这一前端主要由几部分客户服务粘合而成,大部分是C写的:MySQL客户端,Memcached客户端,一个JSON端,以及其它。

\u0026#xD;\n

中间件使用了Memcached,Varnish用于页面缓存,一个用Scala写成的MQ,Kestrel和一个Comet服务器也正在规划之中,该服务器也是用Scala写成,当客户端想要跟踪大量的tweet时它就能派上用场。

\u0026#xD;\n

Twitter是作为一个“内容管理平台而非消息管理平台”开始的,因此从一开始基于聚合读取的模型改变到现在的所有用户都需要更新最新tweet的消息模型,需要许许多多的优化。这一改动主要在于三个方面:缓存,MQ以及Memcached客户端。

\u0026#xD;\n

缓存

\u0026#xD;\n

每个tweet平均被126个用户跟踪,所以这里有着明显的缓存需求。在最初的配置中,只有API有着一个页面缓存,当每次从一个用户那里来了一个tweet时就会失效,而应用的其它部分都是无缓存的:

\u0026#xD;\n
8c01768697f59228be6450bd2bc1c9e9.png\
\u0026#xD;\n

第一个架构改动是创建一个直写式向量缓存包含了一个tweet ID的数组,tweet ID是序列化的64位整数。这一缓存的命中率是99%。

\u0026#xD;\n

第二个改动是加入另一个直写式行缓存,它包含了数据库记录:用户和tweets。这一缓存有着95%的命中率并且使用了Nick Kallen的名为Cache Money的Rails插件。Nick是Twitter的一名系统架构师。

\u0026#xD;\n

第三个改动是引入了一个直读式的碎片缓存,它包含了通过API客户端访问到的tweets的序列化版本,这些tweets可以被打包成JSON,XML或者是Atom的格式,有着同样是95%的命中率。这一碎片缓存“直接消费向量,而且如果现在缓存了一个序列化的碎片,它不会加载你试图看到的该tweet的实际的行,因此它将在大量时间将数据库置于短路状态,”Evan这样说到。

\u0026#xD;\n

还有另一个改动是为页面缓存创建一个单独的缓存池。根据Evan的说法,该页面缓存池使用了一个分代的键模式,而不是直接的失效,因为用户可以

\u0026#xD;\n
\u0026#xD;\n

发送HTTP的if-modified-since并且将任何他们想要的时间戳放入请求路径,我们需要将这一数组切片并只呈现给他们他们想要看到的tweets,但我们不想跟踪客户端所使用的所有可能的键值。这一分代的键模式有一个大问题,在于它不会删除所有失效的键值。每一个被加入的对应到人们所接收的tweets数目的页面都会向缓存推送有效的数据,最后变得我们的缓存仅仅只有五个小时的有效生命周期,因为所有的页面缓存都将流过。

\u0026#xD;\n
\u0026#xD;\n

当该页面缓存转移到其自己的池之后,缓存未命中降低了将近50%。

\u0026#xD;\n

这是Twitter现在所使用的缓存模式:

\u0026#xD;\n
219d90ab6c8e65ea1de10f9009ae9300.png\
\u0026#xD;\n

因为80%的Twitter流量都来自API,因此还有额外的二层缓存,每一个最多将处理95%来自前一层的请求。整体的缓存改动总共有百分之二三十的优化,它带来了

\u0026#xD;\n
\u0026#xD;\n

10倍的容量提升,它本可以更多,但现在我们遇到了另一瓶颈...我们的策略是首先加入直读式缓存,确保它正确失效,然后再转移到直写式缓存并且在线修复,而不是当一个新的tweet ID进来时每次都要销毁。

\u0026#xD;\n
\u0026#xD;\n

消息队列

\u0026#xD;\n

因为,平均来说一个用户有126个追随者,这就意味着每个tweet将有126个消息在队列里。同时,流量会有出现高峰的时候,就像在奥巴马就职的时候达到了每秒几百个tweet或者说是成千上万的消息在队列里,是正常流量的3倍。MQ应当去化解这一高峰并随着时间将其分散,这样就不用增加许多额外的硬件。Twitter的MQ很简单:基于Memcached的协议,job之间是无序的,服务器之间没有共享的状态,所有的东西都保存在RAM里,并且是事务性的。

\u0026#xD;\n

第一版的MQ实现是用的Starling,以Ruby写成,伸缩性不佳,特别是Ruby的GC不是分代的。这将导致MQ在某一点上崩溃,因为GC完成工作时将会把整个队列处理中止。因此作出了将MQ移植到Scala上的决定,它有着更为成熟的JVM GC机制。现有的MQ仅仅只有1200行代码并且运行在3台服务器上。

\u0026#xD;\n

Memcached客户端

\u0026#xD;\n

Memcached客户端的优化目的是试图优化集群负载。现在的客户端用的是libmemcached,Twitter是其最重要的用户和其代码库最重要的贡献者。基于此,持续一年的碎片缓存优化带来了50倍的每秒页面请求服务增加。

\u0026#xD;\n
dde38489d8cf666917f17e52c16e1f8d.png\
\u0026#xD;\n

因为请求来自的位置难以确定,处理请求最快的办法就是将预先计算好的数据存储在网络RAM上,而不是当需要的时候在每个服务器上都重新计算一次。这一方式被主流的Web 2.0站点所使用,它们几乎都是完全直接运行于内存之上。根据Evan的说法,下一步就是“既可伸缩的读持续了一年之后,(解决)可伸缩的写,然后就是多协同定位的问题”。

\u0026#xD;\n

这一QCon的演示文件发布在Evan的站点上。

\u0026#xD;\n

查看英文原文:Twitter, an Evolving Architecture


推荐阅读
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
author-avatar
萍水相逢--莹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有