写点什么

Twitter 的实时通知架构

2017 年 6 月 26 日

Twitter 工程经理 Sarrabh Pathak 在伦敦 QCon 2017 大会上介绍了Twitter 网站的通知系统架构。他主要介绍了Twitter 所面临的独特挑战,比如社交网络的双峰(bimodal)性、如何应付尖刺流量以及如何实现实时的通知机制。

Pathak 解释说,与一般的社交网络不同,Twitter 的用户数据具有不对称性。有些用户有数百万关注者,而有些则只有不到百人。这导致了通知具有双峰性,也给实现实时通知带来了挑战。例如,名人的推文比普通人的推文产生更大的通知负载。

Pathak 说,不同类型的用户以及严格的性能需求给架构带来了如下挑战:

  • 延迟:人们要尽可能快地收到通知,毕竟 Twitter 需要实时地通知用户当下正在发生的事情。
  • 展开(fanout):一个拥有数百万关注者的用户,他的一个推文会触发数百万个通知,系统必须能够处理这种大型的尖刺流量。
  • 不均衡的调用:有些内部调用,比如访问缓存,只需要几毫秒。而有些外部调用,比如访问 Google,可能需要半秒多钟。在进行伸缩时必须考虑到这些情况。
  • 多数据中心:Twitter 必须尽可能地具备弹性,即使发生了故障,也要保证用户仍然能够收到通知。

首先,通知分为推送和拉取两种模式。人们在访问 Twitter 时看到的通知信息流使用的是拉取模式,而短信和邮件则使用推送模式。

Pathak 说,对于拉取模式,通知一般是从缓存里获取的,因为信息流的生成是很耗费资源的。Twitter 使用了 Manhatten ,Twitter 的实时分布式后端存储,也是 Redis 的一个分支。通过使用缓存,最小化了延迟,提升了用户体验。与此同时,通知信息流通过异步的方式被复制到多个数据中心,目的是在发生故障时,用户仍然能够看到相同的信息流。

为了应对延迟和尖刺流量问题,Twitter 使用了推送通知模式,不仅进行横向伸缩,同时还使用了临时缓存。这解决了同一个用户有数百万个通知事件的问题。

为了解决不均衡调用问题,Twitter 使用了优先级队列来防止调用阻塞;名人的推文不会对其他用户的登录造成阻塞。另外,不同类型的调用被分成组,这意味着因外部依赖发生宕机造成的影响是相互隔离的。

最后,Pathak 对该架构进行了总结:

  • 尽可能专注在异步操作上,因为它比同步操作更容易伸缩。
  • 在权衡读取时间和写入时间时,考虑只写入不太可能发生过期的数据,比如 ID。
  • 确保应用能够支持多数据中心部署。

整个访谈可以在线观看,里面还有一个来自Twitter 工程师Gary Lam 关于个人定制化通知的访谈。

查看英文原文: Real-Time Notifications at Twitter

2017 年 6 月 26 日 19:001997
用户头像

发布了 321 篇内容, 共 108.9 次阅读, 收获喜欢 104 次。

关注

评论

发布
暂无评论
发现更多内容

关于binlog,这个参数能不能用?

Simon

MySQL Binlog

接口测试怎么进行,如何做好接口测试

测试人生路

软件测试 接口测试

我在阿里巴巴做 Serverless 云研发平台

阿里巴巴云原生

Serverless 容器 开发者 云原生 CloudNative

单机服务器模型,reactor的5种实现方式,只有这样才算了解了

linux亦有归途

c++ Linux reactor 后端开发

京东T7架构师手写的10万字Spring Boot详细学习笔记+源码免费下载

Java成神之路

Java 程序员 架构 面试 编程语言

加码线下,新荣耀“破题”场景经济

脑极体

面试无忧:源码+实践,讲到MySQL调优的底层算法实现

996小迁

Java 架构 面试

程序员的故事

Philips

敏捷开发 快速开发 原创小说 企业开发 企业应用

「更高更快更稳」,看阿里巴巴如何修炼容器服务「内外功」

阿里巴巴云原生

容器 运维 云原生 双十一 CloudNative

国产电子表格Luckysheet后台也开源了!支持在线协作,一键docker私有部署

奇异石榴果

Java Excel SpreadJS 表格控件

Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)

linux大本营

c++ Linux 后台开发 架构师

腾讯大牛整合Java+spring5系统学习架构,神乎其技

小Q

Java 学习 编程 面试 spring 5

即使不会node.js,拖拽就可完成数据的可视化展示

华为云开发者社区

node.js 数据 可视化

一个真正0基础小白学习前端开发的心路历程

华为云开发者社区

开发 开发小白 0基础

讲述我在阿里六面的经历,幸好我掌握了这份“Java并发编程+面试题库”成功拿到20K的offer

比伯

Java 编程 架构 面试 计算机

架构师训练营第二周框架设计课后练习

Geek_xq

javascript开发后端程序的神器nodejs

程序那些事

Java nodejs 后端开发 koa 程序那些事

训练营第七周作业

大脸猫

极客大学架构师训练营

ONES 收购知名协作工具 Tower

万事ONES

团队协作 高效 研发管理工具 收购 资讯

新闻|Babelfish使PostgreSQL直接兼容SQL Server应用程序

PostgreSQLChina

数据库 postgresql 开源

打造Django私有化缓存组件django-api-cache

pygodnet

django django-api-cache django缓存 私有化缓存 接口缓存

ONES 收购 Tower,五源资本合伙人对话两位创始人

万事ONES

项目管理 团队协作 ONES Tower 收购

想了解任务型对话机器人,我们先从自然语言理解聊起

华为云开发者社区

人工智能 机器人 自然语言

性能压测

jorden wang

技巧收藏|10个JavaScript常用数组操作方法

华为云开发者社区

Java 数组 开发

挑战赛 | 话题王者VS互动先锋(第一季)

InfoQ写作平台官方

话题讨论 活动专区

《前端实战总结》之使用CSS3实现酷炫的3D旋转透视

徐小夕

css3 前端 前端工程 CSS小技巧

已拿腾讯后台开发岗offer,简单说下自己的面试经历和学习路线

程序员小灰

c++ 后台开发 架构师 TCP/IP Linux服务器开发

年轻人想详细了解做了十年Linux跟做了十年Windows的程序员差距有多大吗?听我慢慢道来!

ShenDu_Linux

Linux 程序员 windows

架构师训练营 1 期 -- 第十一周总结

曾彪彪

极客大学架构师训练营

给你一个亿的keys,Redis如何统计?

不才陈某

redis

微服务架构下如何保证事务的一致性

微服务架构下如何保证事务的一致性

Twitter的实时通知架构-InfoQ