剖析Twitter的实时信息分析服务Answers的架构

所属分类: 网站运营 / 建站经验 阅读数: 124
收藏 0 赞 0 分享

2014年Twitter发布了Answers,至今移动社区产生了惊人的使用量,让Twitter感到兴奋不已。现在Answers每天处理50亿次会话,并且这个数量在持续增加。上亿设备每秒向Answers端点发送数以百万计的请求。在你已经阅读到此处的这段时间里,Answers后台收到并处理了一千万次分析事件。

其中的挑战是如何利用这些信息向移动开发者提供可靠的、实时的、有实际价值的洞见(视角)去了解他们的移动应用。

在高层,Twitter依靠 组件解耦、异步通信、在应对灾难性故障时优雅地服务降级等原则来帮助架构决策。Twitter使用Lambda架构将数据完整性和实时数据更新结合起来。

在实践过程中,Twitter需要设计一个能够接收并保存事件、执行离线和实时计算且能将上述两种计算结果整合成相关信息的系统。这些行为全部都要以百万次每秒的规模执行。

让Twitter从第一个挑战开始:接受并处理这些事件。

事件接收

在设计设备-服务器通信的时候,Twitter的目标是:减少对电池和网络使用的影响;确保数据的可靠性;接近实时地获取数据。为了减少对设备的影响,Twitter批量地发送分析数据并且在发送前对数据进行压缩。为了保证这些宝贵的数据始终能够到达Twitter的服务器,在传输失败随机退避后以及达到设备存储达到上限时,设备会进行重传。为了确保数据能够尽快到达服务器,Twitter设置来多个触发器来使设备尝试发送:当程序运行于前台的时候,事件触发器每分钟触发一次;一个消息数量触发器和程序转入后台触发器。

这样的通信协议导致设备每秒发送来数以万计压缩过的有效载荷。每一个载荷都包含数十条事件。为了能够可靠的、易于线性伸缩的方式去处理载荷,接收事件的服务必须极度简单。
201633100026455.jpg (555×241)

这个服务使用GO语言编写,这个服务使用了亚马逊弹性负载均衡器(ELB),并将每一个消息负荷放入一个持久化的Kafka队列。

存储

Kafka是一个持久存储器,因为它把收到的消息写入磁盘并且每个消息都有多份冗余。因此一旦Twitter知道信息到了Kafka队列,Twitter就可以通过延迟处理、再处理来容忍下游延迟和下游失败。然而,Kafka不是Twitter历史数据的永久真理之源——按照上文提到的速度,仅仅是几天的数据,Twitter也需要数以百计的box来存储。因此Twitter把Kafka集群配置为将消息只保留几个小时(这些时间足够Twitter处理不期而至的重大故障)并且将数据尽快地存入永久存储——亚马逊简易存储服务(Amazon S3)。
201633100048018.jpg (555×241)

Twitter广泛地使用Storm来进行实时数据处理,第一个相关的Topology就是从Kafka读取信息并存储到Amazon S3上。

批量计算

一旦这些数据存到了S3上,Twitter可以使用亚马逊弹性MapReduce(Amazon EMR)来计算Twitter的数据能够计算的任何东西。这既包括要展示在客户的仪表盘上的数据,也包括Twitter为了开发新功能而开发的实验性的任务。
201633100111484.jpg (555×246)

Twitter使用Cascading框架编写、Amazon EMR执行MapReduce程序。 Amazon EMR将Twitter存储到S3上的数据作为输入,处理完毕后,再将结果存入S3。Twitter通过运行在Storm上的调度topology来探测程序执行完毕,并将结果灌入Cassandra集群,这样结果就能用于亚秒级查询API。

实时计算

迄今,Twitter描述的是一个能够执行分析计算的持久的容错的框架。然而,存在一个显眼的问题——这个框架不是实时的。一些计算每小时计算一次,有的计算需要一整天的数据作为输入。计算时间从几分钟到几小时不等,把S3上的输出导入到服务层也需要这么多时间。因此,在最好情况下,Twitter的数据也总是拖后几个小时,显然不能满足实时和可操作的目标。

为了达成实时的目标,数据涌入后进行存档的同时,Twitter对数据进行流式计算。
201633100129981.jpg (555×231)

就像Twitter的存储Topology读取数据一样,一个独立的Storm Topology实时地从Kafka Topic中读取数据然后进行实时计算,计算的逻辑和MapReduce任务一样。这些实时计算的结果放在另一个独立的Cassandra集群里以供实时查询。

为了弥补Twitter在时间以及在资源方面可能的不足,Twitter没有在批量处理层中而是在实时计算层中使用了一些概率算法,如布隆过滤器、HyperLogLog(也有一些自己开发的算法)。相对于那些蛮力替代品,这些算法在空间和时间复杂度上有数量级的优势,同时只有可忽略的精确度损失。

合并

现在Twitter拥有两个独立生产出的数据集(批处理和实时处理),Twitter怎么将二者合并才能得到一个一致的结果?
201633100148221.jpg (555×333)

Twitter在API的逻辑中,根据特定的情况分别使用两个数据集然后合并它们。

因为批量计算是可重现的,且相对于实时计算来说更容错,Twitter的API总是倾向于使用批量产生的数据。例如,API接到了一个三十天的时间序列的日活跃用户数量数据请求,它首先会到批量数据Cassandra集群里查询全范围的数据。如果这是一个历史数据检索,所有的数据都已经得到。然而,查询的请求更可能会包含当天,批量产生的数据填充了大部分结果,只有近一两天的数据会被实时数据填充。

错误处理

让Twitter来温习几个失效的场景,看一下这样的架构在处理错误的时候, 是如何避免宕机或者损失数据,取之以优雅地降级。

Twitter在上文中已经讨论过设备上的回退重试策略。在设备端网络中断、服务器端短时无服务情况下,重试保证数据最终能够到达服务器。随机回退确保设备不会在某区域网络中断或者后端服务器短时间不可用之后,不会压垮(DDos攻击)服务器。

当实时处理层失效时,会发生什么?Twitter待命的工程师会受到通知并去解决问题。因为实时处理层的输入是存储在持久化的Kafka集群里,所以没有数据会丢失;等实时处理恢复之后,它会赶上处理那些停机期间应该处理的数据。

因为实时处理和批处理是完全解耦的,批处理层完全不会受到影响。因此唯一的影响就是实时处理层失效期间,对数据点实时更新的延迟。

如果批处理层有问题或者严重延迟的话,会发生什么?Twitter的API会无缝地多获取实时处理的数据。一个时间序列数据的查询,可能先前只取一天的实时处理结果,现在就需要查询两到三天的实时处理结果。因为实时处理和批处理是完全解耦的,实时处理不受影响继续运行。同时,Twitter的待命工程师会得到消息并且解决批处理层的问题。一旦批处理层恢复正常,它会执行那些延迟的数据处理任务,API也会无缝切换到使用现在可以得到的批处理的结果。

Twitter系统后端架构由四大组件构成:事件接收,事件存储,实时计算和批量计算。各个组件之间的持久化队列确保任意组件的失效不会扩散到其他组件,并且后续可以从中断中恢复。API可以在计算层延迟或者失效时无缝地优雅降级,在服务恢复后重新恢复;这些都是由API内部的检索逻辑来保证的。

Answer的目标是创建一个仪表盘,这个仪表盘能够把了解你的用户群变得非常简单。因此你可以将时间花费在打造令人惊叹的用户体验上,而不是用来掘穿数据。

更多精彩内容其他人还在看

医疗行业怎么做好网站建设?建站注意事项及经验

踏足互联网,医疗行业可以将自身优势资源整合到网站中去,为大家提供病理知识、在线咨询或者预约就诊服务等。那么如何做好医疗行业的网站建设呢?本期为大家分享一些在建站过程中需要注意的东西和建站经验,希望能给大家带来帮助
收藏 0 赞 0 分享

企业应该怎么策划自己的网站?规划网站注意事项总结

网站建设虽然是一个比较复杂的过程,包括网站策划、网页设计、程序开发、上传网页、发布网站等,那么企业应该怎么策划自己的网站?下面为大家介绍规划网站注意事项,来看看吧
收藏 0 赞 0 分享

大众点评网站的支付系统构建经验分享

大众点评网站的服务器端在迭代的同时保持了很好的扩展性和可用性,这里我们来看一下大众点评网站的支付系统构建经验分享,主要以大众点评的支付渠道网关系统为核心.
收藏 0 赞 0 分享

网易蜂巢的容器运维管理服务使用指南

网易蜂巢提供对Docker容器的警报和性能监控服务,通过图形化面板操作十分简洁,这里前提假设服务器端已经架设在容器中,那么接下来就让我们来看网易蜂巢的容器运维管理服务使用指南
收藏 0 赞 0 分享

为什么认为自助建站不适合SEO?自助建站工具搭建出来的网站对SEO的支持如何?

最近有一个做SEO优化朋友询问为什么自助建站做出来的网站排名很难做上去?自助建站工具搭建出来的网站真的适合SEO吗?本文将提供相关内容供大家了解,希望对大家有所帮助和启发
收藏 0 赞 0 分享

支持支付宝的高性价比美国VPS主机Pzea的购买及使用评测

Pzea一直是低价位VPS的人气之选,在美国三个大城市分别建有机房,且构建于KVM虚拟机之上,性能较为出众,接下来就为大家来分享一下这个支持支付宝的高性价比美国VPS主机Pzea的购买及使用评测
收藏 0 赞 0 分享

网站页面一定需要HTML静态化吗 实战说明静态化的必要性

很多刚开始运营网站的伙伴们都要知道网站内的页面需要进行URL优化吗?如设置静态化等,对此,本文就为大家解析一下网站静态化的必要性,有兴趣的朋友们可以了解下哦
收藏 0 赞 0 分享

移动端界面设计之尺寸基础知识学习

这篇文章主要为大家详细介绍了移动端界面设计之尺寸基础知识,通俗易懂的学习教程帮助大家了解关于移动端设计尺寸的相关知识,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

如何提高用户体验?优秀的用户体验需要遵守的十大准则

自己的网站做的很漂亮却依然没有排名,这是为什么呢?这个时候,你应该考虑你是否关注到用户体验?而如何提高用户体验又是你要考虑的问题了,本文将提供优秀的用户体验需要遵守的十大准则供大家了解,希望对大家有所帮助和启发
收藏 0 赞 0 分享

DoubleClick Ad Exchange Seller(adx) 为您的广告代码生成异步代码的方法

这篇文章主要介绍了DoubleClick Ad Exchange Seller(adx) 为您的广告代码生成异步代码的方法,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多