# 美国大选期间城市飞艇如何扩展到 25 亿条通知
> 原文: [http://highscalability.com/blog/2016/11/14/how-urban-airship-scaled-to-25-billion-notifications-during.html](http://highscalability.com/blog/2016/11/14/how-urban-airship-scaled-to-25-billion-notifications-during.html)
![](https://img.kancloud.cn/fd/bb/fdbb19cf23c7d830dcd8b1f35c4e214c_125x125.png)
*这是 Urban Airship 的来宾帖子。 贡献者:亚当·洛瑞(Adam Lowry),肖恩·莫兰(Sean Moran),迈克·赫里克(Mike Herrick),丽莎·奥尔(Lisa Orr),托德·约翰逊(Christine Ciandrini),阿什什·沃蒂(Ashish Warty),尼克·阿德雷德(Nick Adlard),梅勒·萨克斯·巴尼特(Mele Sax-Barnett),尼尔·凯利(Niall Kelly),格雷厄姆·福里斯特(Graham Forest)和加文·麦奎兰*
Urban Airship 受到数以千计希望通过移动技术发展的企业的信任。 Urban Airship 是一家成立 7 年的 SaaS 公司,拥有免费增值业务模式,因此您可以免费试用 [](https://www.urbanairship.com/lps/best-push-notification-service)。 有关更多信息,请访问 [www.urbanairship.com](http://www.urbanairship.com/) 。 目前,城市飞艇平均每天发送的推送通知超过 10 亿条。 这篇文章重点介绍了 2016 年美国大选的城市飞艇通知使用情况,探讨了系统的架构-核心传递管道-为新闻发布者提供数十亿次实时通知。
## 2016 年美国大选
在选举日前后的 24 小时内,Urban Airship 发出了 25 亿条通知,这是有史以来的最高日发送量。 这相当于在美国每人 8 条通知,或者世界上每部活动的智能手机 1 条通知。 虽然 Urban Airship 在每个行业垂直领域为超过 45,000 个应用程序提供支持,但对选举使用情况数据的分析显示,超过 400 种媒体应用程序占了这一记录量的 60%,随着跟踪选举结果并在一天之内发送 15 亿条通知 报告。
![](https://img.kancloud.cn/e4/e9/e4e977055dc5550cf91f02510efb83ec_500x104.png)
总统选举结束时,通知量稳定并达到顶峰。
![election-urbanairship-notification.png](https://img.kancloud.cn/57/b9/57b9eedfefed6132cd26e47aeafc7276_1600x849.png)
到城市飞艇的 HTTPS 入口流量 [API](http://docs.urbanairship.com/api/ua.html) 在选举期间达到了每秒近 75,000 的峰值。 这些流量大部分来自城市飞艇 [SDK](http://docs.urbanairship.com/dev-resources.html) 与城市飞艇 [API](http://docs.urbanairship.com/api/ua.html) [ 。
![election-urbanairship-HTTPS.png](https://img.kancloud.cn/99/5e/995e6da9669fb6c587d1a2308fccd733_703x241.png)
推送通知量一直在迅速增加。 最近的主要推动力是英国退欧,奥运会和美国大选。 2016 年 10 月,每月通知量同比增长 150%。
![monthly-sends.png](https://img.kancloud.cn/a4/11/a4115fcb74f004325c204f24c8a657e7_1540x808.png)
## 核心交付管道架构概述
核心交付管道(CDP)是城市飞艇系统,负责从观众选择器中实现设备地址,并传递通知。 无论我们同时发送给数千万用户,针对多个复杂的子细分受众群,包含个性化内容或介于两者之间的任何内容,我们发送的所有通知都期望低延迟。 这是我们的架构的概述,以及我们在此过程中学到的一些知识。
### 我们是如何开始的
最初从 2009 年开始是一个 Web 应用程序,当时有些工人已经转变为面向服务的体系结构。 随着旧系统的各个部分开始遇到规模问题,我们将它们提取到了一个或多个新服务中,这些服务旨在满足相同的功能集,但规模更大且性能更好。 我们许多原始的 [API](http://docs.urbanairship.com/api/ua.html) API 和工作人员都是用 Python 编写的,然后将它们提取到高并发 Java 服务中。 在最初将设备数据存储在一组 Postgres 分片中的地方,我们的规模迅速超过了添加新分片的能力,因此我们转向使用 HBase 和 Cassandra 的多数据库体系结构。
CDP 是处理分段和推送通知传递的服务的集合。 这些服务根据请求提供相同类型的数据,但是出于性能原因,每个服务都以非常不同的方式对数据进行索引。 例如,我们有一个系统负责处理广播消息,向注册到相关应用程序的每个设备传递相同的通知有效负载。 该服务及其底层数据存储区的设计与我们负责根据位置或用户个人资料属性传递通知的服务的设计有很大不同。
我们将任何长期存在的进程视为一项服务。 这些长期存在的过程遵循有关度量,配置和日志记录的通用模板,以简化部署和操作。 通常,我们的服务属于以下两类之一:RPC 服务或使用者服务。 RPC 服务使用非常类似于 GRPC 的内部库提供命令来与服务进行同步交互,而消费者服务则处理来自 Kafka 流的消息,并对这些消息执行特定于服务的操作。
![urbanairship-cdp.png](https://img.kancloud.cn/d7/3b/d73b629325df42081d5f51ed7b96c9e1_1600x677.png)
### 数据库
为了满足我们的性能和规模要求,我们严重依赖 HBase 和 Cassandra 来满足我们的数据存储需求。 尽管 HBase 和 Cassandra 都是列式 NoSQL 存储,但它们的取舍却大不相同,这些折衷影响我们使用哪个存储以及用于什么目的。
HBase 非常适合高通量扫描,响应的预期基数很高,而 Cassandra 非常适合低基数查找,其中响应仅包含少量结果。 两者都允许大量的写入吞吐量,这是我们的要求,因为来自用户手机的所有元数据更新都是实时应用的。
它们的故障特性也不同。 在发生故障时,HBase 支持一致性和分区容忍度,而 Cassandra 则支持可用性和分区容忍度。 每个 CDP 服务都有一个非常特定的用例,因此具有高度专业化的架构,旨在促进所需的访问模式并限制存储空间。 通常,每个数据库仅由单个服务访问,该服务负责通过不太专门的界面提供对其他服务的数据库访问。
加强服务与其支持数据库之间的 1:1 关系具有许多好处。
* 通过将服务的支持数据存储视为实现细节而不是共享资源,我们可以获得灵活性。
* 我们可以在不更改服务代码的情况下调整服务的数据模型。
* 使用情况跟踪更为直接,这使容量规划更加容易。
* 故障排除更加容易。 有时服务代码存在问题,而其他时候则是备份数据库问题。 将服务和数据库作为逻辑单元可以极大地简化故障排除过程。 我们不必怀疑“还有谁可以访问该数据库以使其表现为这种方式?” 相反,我们可以依靠服务本身的应用程序级指标,而只担心一组访问模式。
* 因为只有一种服务与数据库交互,所以我们几乎可以执行所有维护活动,而无需停机。 繁重的维护任务成为服务级别的问题:可以在不中断服务的情况下完成数据修复,模式迁移,甚至切换到完全不同的数据库。
的确,在将应用程序拆分为较小的服务时,可能需要进行一些性能折衷。 但是,我们发现,在满足高可伸缩性和高可用性要求方面获得的灵活性远远超过了其价值。
### 数据建模
我们的大多数服务都处理相同的数据,只是格式不同。 一切都必须保持一致。 为了使所有这些服务的数据保持最新,我们严重依赖 Kafka。 Kafka 非常快,也很耐用。 速度需要权衡。 仅保证 Kafka 邮件至少发送一次 ,并且不能保证依次发送。
我们如何处理? 我们已将所有变异路径建模为可交换的:可以以任何顺序应用操作并最终得到相同的结果。 它们也是幂等的。 这有一个很好的副作用,我们可以重放 Kafka 流以进行一次性数据修复作业,回填甚至迁移。
为此,我们利用了 HBase 和 Cassandra 中都存在的“单元版本”的概念。 通常,这是一个时间戳,但可以是您想要的任何数字(有一些例外;例如,MAX_LONG 可能会导致一些奇怪的行为,具体取决于您的 HBase 或 Cassandra 的版本以及架构如何处理删除)。
对我们来说,这些单元格的一般规则是它们可以具有多个版本,而我们订购版本的方式则取决于它们提供的时间戳。 考虑到这种行为,我们可以将传入的消息分解为一组特定的列,然后将该布局与自定义应用程序逻辑结合起来进行逻辑删除,同时考虑时间戳。 这样可以在保持数据完整性的同时盲写基础数据存储。
仅仅盲目地将更改写入 Cassandra 和 HBase 并非没有问题。 一个很好的例子是在重放事件中重复写入相同数据的情况。 尽管由于我们努力使记录成为幂等,数据的状态不会改变,但必须压缩重复的数据。 在最极端的情况下,这些额外的记录可能会导致大量的压缩延迟和备份。 由于这个细节,我们密切监视压缩时间和队列深度,因为在 Cassandra 和 HBase 中落后于压缩会导致严重的问题。
通过确保流中的消息遵循一组严格的规则,并设计使用服务以预期乱序和重复的消息,我们可以使大量不同的服务仅与一两秒钟保持同步 滞后的更新。
### 服务设计
我们的大多数服务都是用 Java 编写的,但是使用的是一种自以为是的现代风格。 在设计 Java 服务时,我们要考虑一组通用准则:
* **做一件事,做好它。** -设计服务时,它应该承担单一责任。 实施者可以决定职责中包括的内容,但是她或他将需要准备在代码审查情况下证明其合理性。
* **没有共享的操作状态** -设计服务时,假定将始终至少有三个实例在运行。 服务需要能够在没有任何外部协调的情况下处理任何其他实例可以处理的相同确切请求。 那些熟悉 Kafka 的人会注意到,Kafka 使用者在外部协调对 topic:group 对的分区所有权。 本指南涉及特定于服务的外部协调,而不是利用可能在幕后进行外部协调的库或客户端。
* **约束您的队列** -我们在所有服务中使用队列,它们是将请求分批并将其散布到最终将完成任务的工作人员的好方法 从外部阻止。 所有队列都应有界。 边界队列确实引发了许多问题,但是:
* 当队列已满时,生产者会怎样? 他们应该阻止吗? 除? 下降?
* 我的队列应该有多大? 要回答此问题,有助于假设队列始终已满。
* 如何完全关闭?
* 根据确切的用例,每个服务将针对这些问题提供不同的答案。
* **命名自定义线程池并注册 UncaughtExceptionHandler** -如果最终创建自己的线程池,则使用 [的构造函数或帮助器方法 ]执行器](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html) ,以便我们提供 ThreadFactory。 使用该 ThreadFactory,我们可以正确地命名线程,设置线程的守护进程状态,并注册 [UncaughtExceptionHandler](https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#setUncaughtExceptionHandler-java.lang.Thread.UncaughtExceptionHandler-) 以处理将异常置于顶部的情况 堆栈。 这些步骤使调试我们的服务变得更加容易,并且使我们避免了深夜的挫败感。
* **优先于可变状态而不是可变状态** -在高度并发的环境中,可变状态可能很危险。 通常,我们使用可以在内部子系统和队列之间传递的不可变数据对象。 拥有不变对象是子系统之间通信的主要形式,这使得并发使用的设计更加简单,并且使故障排除更加容易。
## 我们从这里去哪里?
凭借 Urban Airship 通过移动钱包通行证发送通知的功能,对 Web 通知和 Apple News 通知的新支持以及其将通知发送到任何平台,设备或营销渠道的开放渠道功能,我们预计通知量将成倍增长 。 为了满足这一需求,我们将继续在“核心交付管道”架构,服务,数据库和基础架构上进行大量投资。 要了解有关我们技术的更多信息以及前进的方向,请参阅 [GitHub](https://github.com/urbanairship) , [开发人员资源](http://docs.urbanairship.com/dev-resources.html) , [文档](http://docs.urbanairship.com/index.html) 和我们的 [职位页面](https://www.urbanairship.com/careers) 。
- LiveJournal 体系结构
- mixi.jp 体系结构
- 友谊建筑
- FeedBurner 体系结构
- GoogleTalk 架构
- ThemBid 架构
- 使用 Amazon 服务以 100 美元的价格构建无限可扩展的基础架构
- TypePad 建筑
- 维基媒体架构
- Joost 网络架构
- 亚马逊建筑
- Fotolog 扩展成功的秘诀
- 普恩斯的教训-早期
- 论文:Wikipedia 的站点内部,配置,代码示例和管理问题
- 扩大早期创业规模
- Feedblendr 架构-使用 EC2 进行扩展
- Slashdot Architecture-互联网的老人如何学会扩展
- Flickr 架构
- Tailrank 架构-了解如何在整个徽标范围内跟踪模因
- Ruby on Rails 如何在 550k 网页浏览中幸存
- Mailinator 架构
- Rackspace 现在如何使用 MapReduce 和 Hadoop 查询 TB 的数据
- Yandex 架构
- YouTube 架构
- Skype 计划 PostgreSQL 扩展到 10 亿用户
- 易趣建筑
- FaceStat 的祸根与智慧赢得了胜利
- Flickr 的联合会:每天进行数十亿次查询
- EVE 在线架构
- Notify.me 体系结构-同步性
- Google 架构
- 第二人生架构-网格
- MySpace 体系结构
- 扩展 Digg 和其他 Web 应用程序
- Digg 建筑
- 在 Amazon EC2 中部署大规模基础架构的六个经验教训
- Wolfram | Alpha 建筑
- 为什么 Facebook,Digg 和 Twitter 很难扩展?
- 全球范围扩展的 10 个 eBay 秘密
- BuddyPoke 如何使用 Google App Engine 在 Facebook 上扩展
- 《 FarmVille》如何扩展以每月收获 7500 万玩家
- Twitter 计划分析 1000 亿条推文
- MySpace 如何与 100 万个并发用户一起测试其实时站点
- FarmVille 如何扩展-后续
- Justin.tv 的实时视频广播架构
- 策略:缓存 404 在服务器时间上节省了洋葱 66%
- Poppen.de 建筑
- MocoSpace Architecture-一个月有 30 亿个移动页面浏览量
- Sify.com 体系结构-每秒 3900 个请求的门户
- 每月将 Reddit 打造为 2.7 亿页面浏览量时汲取的 7 个教训
- Playfish 的社交游戏架构-每月有 5000 万用户并且不断增长
- 扩展 BBC iPlayer 的 6 种策略
- Facebook 的新实时消息系统:HBase 每月可存储 135 亿条消息
- Pinboard.in Architecture-付费玩以保持系统小巧
- BankSimple 迷你架构-使用下一代工具链
- Riak 的 Bitcask-用于快速键/值数据的日志结构哈希表
- Mollom 体系结构-每秒以 100 个请求杀死超过 3.73 亿个垃圾邮件
- Wordnik-MongoDB 和 Scala 上每天有 1000 万个 API 请求
- Node.js 成为堆栈的一部分了吗? SimpleGeo 说是的。
- 堆栈溢出体系结构更新-现在每月有 9500 万页面浏览量
- Medialets 体系结构-击败艰巨的移动设备数据
- Facebook 的新实时分析系统:HBase 每天处理 200 亿个事件
- Microsoft Stack 是否杀死了 MySpace?
- Viddler Architecture-每天嵌入 700 万个和 1500 Req / Sec 高峰
- Facebook:用于扩展数十亿条消息的示例规范架构
- Evernote Architecture-每天有 900 万用户和 1.5 亿个请求
- TripAdvisor 的短
- TripAdvisor 架构-4,000 万访客,200M 动态页面浏览,30TB 数据
- ATMCash 利用虚拟化实现安全性-不变性和还原
- Google+是使用您也可以使用的工具构建的:闭包,Java Servlet,JavaScript,BigTable,Colossus,快速周转
- 新的文物建筑-每天收集 20 亿多个指标
- Peecho Architecture-鞋带上的可扩展性
- 标记式架构-扩展到 1 亿用户,1000 台服务器和 50 亿个页面视图
- 论文:Akamai 网络-70 个国家/地区的 61,000 台服务器,1,000 个网络
- 策略:在 S3 或 GitHub 上运行可扩展,可用且廉价的静态站点
- Pud 是反堆栈-Windows,CFML,Dropbox,Xeround,JungleDisk,ELB
- 用于扩展 Turntable.fm 和 Labmeeting 的数百万用户的 17 种技术
- StackExchange 体系结构更新-平稳运行,Amazon 4x 更昂贵
- DataSift 体系结构:每秒进行 120,000 条推文的实时数据挖掘
- Instagram 架构:1400 万用户,1 TB 的照片,数百个实例,数十种技术
- PlentyOfFish 更新-每月 60 亿次浏览量和 320 亿张图片
- Etsy Saga:从筒仓到开心到一个月的浏览量达到数十亿
- 数据范围项目-6PB 存储,500GBytes / sec 顺序 IO,20M IOPS,130TFlops
- 99designs 的设计-数以千万计的综合浏览量
- Tumblr Architecture-150 亿页面浏览量一个月,比 Twitter 更难扩展
- Berkeley DB 体系结构-NoSQL 很酷之前的 NoSQL
- Pixable Architecture-每天对 2000 万张照片进行爬网,分析和排名
- LinkedIn:使用 Databus 创建低延迟更改数据捕获系统
- 在 30 分钟内进行 7 年的 YouTube 可扩展性课程
- YouPorn-每天定位 2 亿次观看
- Instagram 架构更新:Instagram 有何新功能?
- 搜索技术剖析:blekko 的 NoSQL 数据库
- Pinterest 体系结构更新-1800 万访问者,增长 10 倍,拥有 12 名员工,410 TB 数据
- 搜索技术剖析:使用组合器爬行
- iDoneThis-从头开始扩展基于电子邮件的应用程序
- StubHub 体系结构:全球最大的票务市场背后的惊人复杂性
- FictionPress:在网络上发布 600 万本小说
- Cinchcast 体系结构-每天产生 1,500 小时的音频
- 棱柱架构-使用社交网络上的机器学习来弄清您应该在网络上阅读的内容
- 棱镜更新:基于文档和用户的机器学习
- Zoosk-实时通信背后的工程
- WordPress.com 使用 NGINX 服务 70,000 req / sec 和超过 15 Gbit / sec 的流量
- 史诗般的 TripAdvisor 更新:为什么不在云上运行? 盛大的实验
- UltraDNS 如何处理数十万个区域和数千万条记录
- 更简单,更便宜,更快:Playtomic 从.NET 迁移到 Node 和 Heroku
- Spanner-关于程序员使用 NoSQL 规模的 SQL 语义构建应用程序
- BigData 使用 Erlang,C 和 Lisp 对抗移动数据海啸
- 分析数十亿笔信用卡交易并在云中提供低延迟的见解
- MongoDB 和 GridFS 用于内部和内部数据中心数据复制
- 每天处理 1 亿个像素-少量竞争会导致大规模问题
- DuckDuckGo 体系结构-每天进行 100 万次深度搜索并不断增长
- SongPop 在 GAE 上可扩展至 100 万活跃用户,表明 PaaS 未通过
- Iron.io 从 Ruby 迁移到 Go:减少了 28 台服务器并避免了巨大的 Clusterf ** ks
- 可汗学院支票簿每月在 GAE 上扩展至 600 万用户
- 在破坏之前先检查自己-鳄梨的建筑演进的 5 个早期阶段
- 缩放 Pinterest-两年内每月从 0 到十亿的页面浏览量
- Facebook 的网络秘密
- 神话:埃里克·布鲁尔(Eric Brewer)谈银行为什么不是碱-可用性就是收入
- 一千万个并发连接的秘密-内核是问题,而不是解决方案
- GOV.UK-不是你父亲的书库
- 缩放邮箱-在 6 周内从 0 到 100 万用户,每天 1 亿条消息
- 在 Yelp 上利用云计算-每月访问量为 1.02 亿,评论量为 3900 万
- 每台服务器将 PHP 扩展到 30,000 个并发用户的 5 条 Rockin'Tips
- Twitter 的架构用于在 5 秒内处理 1.5 亿活跃用户,300K QPS,22 MB / S Firehose 以及发送推文
- Salesforce Architecture-他们每天如何处理 13 亿笔交易
- 扩大流量的设计决策
- ESPN 的架构规模-每秒以 100,000 Duh Nuh Nuhs 运行
- 如何制作无限可扩展的关系数据库管理系统(RDBMS)
- Bazaarvoice 的架构每月发展到 500M 唯一用户
- HipChat 如何使用 ElasticSearch 和 Redis 存储和索引数十亿条消息
- NYTimes 架构:无头,无主控,无单点故障
- 接下来的大型声音如何使用 Hadoop 数据版本控制系统跟踪万亿首歌曲的播放,喜欢和更多内容
- Google 如何备份 Internet 和数十亿字节的其他数据
- 从 HackerEarth 用 Apache 扩展 Python 和 Django 的 13 个简单技巧
- AOL.com 体系结构如何发展到 99.999%的可用性,每天 800 万的访问者和每秒 200,000 个请求
- Facebook 以 190 亿美元的价格收购了 WhatsApp 体系结构
- 使用 AWS,Scala,Akka,Play,MongoDB 和 Elasticsearch 构建社交音乐服务
- 大,小,热还是冷-条带,Tapad,Etsy 和 Square 的健壮数据管道示例
- WhatsApp 如何每秒吸引近 5 亿用户,11,000 内核和 7,000 万条消息
- Disqus 如何以每秒 165K 的消息和小于 0.2 秒的延迟进行实时处理
- 关于 Disqus 的更新:它仍然是实时的,但是 Go 摧毁了 Python
- 关于 Wayback 机器如何在银河系中存储比明星更多的页面的简短说明
- 在 PagerDuty 迁移到 EC2 中的 XtraDB 群集
- 扩展世界杯-Gambify 如何与 2 人组成的团队一起运行大型移动投注应用程序
- 一点点:建立一个可处理每月 60 亿次点击的分布式系统的经验教训
- StackOverflow 更新:一个月有 5.6 亿次网页浏览,25 台服务器,而这一切都与性能有关
- Tumblr:哈希处理每秒 23,000 个博客请求的方式
- 使用 HAProxy,PHP,Redis 和 MySQL 处理 10 亿个请求的简便方法来构建成长型启动架构
- MixRadio 体系结构-兼顾各种服务
- Twitter 如何使用 Redis 进行扩展-105TB RAM,39MM QPS,10,000 多个实例
- 正确处理事情:通过即时重放查看集中式系统与分散式系统
- Instagram 提高了其应用程序的性能。 这是如何做。
- Clay.io 如何使用 AWS,Docker,HAProxy 和 Lots 建立其 10 倍架构
- 英雄联盟如何将聊天扩大到 7000 万玩家-需要很多小兵。
- Wix 的 Nifty Architecture 技巧-大规模构建发布平台
- Aeron:我们真的需要另一个消息传递系统吗?
- 机器:惠普基于忆阻器的新型数据中心规模计算机-一切仍在变化
- AWS 的惊人规模及其对云的未来意味着什么
- Vinted 体系结构:每天部署数百次,以保持繁忙的门户稳定
- 将 Kim Kardashian 扩展到 1 亿个页面
- HappyPancake:建立简单可扩展基金会的回顾
- 阿尔及利亚分布式搜索网络的体系结构
- AppLovin:通过每天处理 300 亿个请求向全球移动消费者进行营销
- Swiftype 如何以及为何从 EC2 迁移到真实硬件
- 我们如何扩展 VividCortex 的后端系统
- Appknox 架构-从 AWS 切换到 Google Cloud
- 阿尔及利亚通往全球 API 的愤怒之路
- 阿尔及利亚通往全球 API 步骤的愤怒之路第 2 部分
- 为社交产品设计后端
- 阿尔及利亚通往全球 API 第 3 部分的愤怒之路
- Google 如何创造只有他们才能创造的惊人的数据中心网络
- Autodesk 如何在 Mesos 上实施可扩展事件
- 构建全球分布式,关键任务应用程序:Trenches 部分的经验教训 1
- 构建全球分布式,关键任务应用程序:Trenches 第 2 部分的经验教训
- 需要物联网吗? 这是美国一家主要公用事业公司从 550 万米以上收集电力数据的方式
- Uber 如何扩展其实时市场平台
- 优步变得非常规:使用司机电话作为备份数据中心
- 在不到五分钟的时间里,Facebook 如何告诉您的朋友您在灾难中很安全
- Zappos 的网站与 Amazon 集成后冻结了两年
- 为在现代时代构建可扩展的有状态服务提供依据
- 细分:使用 Docker,ECS 和 Terraform 重建基础架构
- 十年 IT 失败的五个教训
- Shopify 如何扩展以处理来自 Kanye West 和 Superbowl 的 Flash 销售
- 整个 Netflix 堆栈的 360 度视图
- Wistia 如何每小时处理数百万个请求并处理丰富的视频分析
- Google 和 eBay 关于构建微服务生态系统的深刻教训
- 无服务器启动-服务器崩溃!
- 在 Amazon AWS 上扩展至 1100 万以上用户的入门指南
- 为 David Guetta 建立无限可扩展的在线录制活动
- Tinder:最大的推荐引擎之一如何决定您接下来会看到谁?
- 如何使用微服务建立财产管理系统集成
- Egnyte 体系结构:构建和扩展多 PB 分布式系统的经验教训
- Zapier 如何自动化数十亿个工作流自动化任务的旅程
- Jeff Dean 在 Google 进行大规模深度学习
- 如今 Etsy 的架构是什么样的?
- 我们如何在 Mail.Ru Cloud 中实现视频播放器
- Twitter 如何每秒处理 3,000 张图像
- 每天可处理数百万个请求的图像优化技术
- Facebook 如何向 80 万同时观看者直播
- Google 如何针对行星级基础设施进行行星级工程设计?
- 为 Mail.Ru Group 的电子邮件服务实施反垃圾邮件的猫捉老鼠的故事,以及 Tarantool 与此相关的内容
- The Dollar Shave Club Architecture Unilever 以 10 亿美元的价格被收购
- Uber 如何使用 Mesos 和 Cassandra 跨多个数据中心每秒管理一百万个写入
- 从将 Uber 扩展到 2000 名工程师,1000 个服务和 8000 个 Git 存储库获得的经验教训
- QuickBooks 平台
- 美国大选期间城市飞艇如何扩展到 25 亿个通知
- Probot 的体系结构-我的 Slack 和 Messenger Bot 用于回答问题
- AdStage 从 Heroku 迁移到 AWS
- 为何将 Morningstar 迁移到云端:降低 97%的成本
- ButterCMS 体系结构:关键任务 API 每月可处理数百万个请求
- Netflix:按下 Play 会发生什么?
- ipdata 如何以每月 150 美元的价格为来自 10 个无限扩展的全球端点的 2500 万个 API 调用提供服务
- 每天为 1000 亿个事件赋予意义-Teads 的 Analytics(分析)管道
- Auth0 体系结构:在多个云提供商和地区中运行
- 从裸机到 Kubernetes
- Egnyte Architecture:构建和扩展多 PB 内容平台的经验教训
- 缩放原理
- TripleLift 如何建立 Adtech 数据管道每天处理数十亿个事件
- Tinder:最大的推荐引擎之一如何决定您接下来会看到谁?
- 如何使用微服务建立财产管理系统集成
- Egnyte 体系结构:构建和扩展多 PB 分布式系统的经验教训
- Zapier 如何自动化数十亿个工作流自动化任务的旅程
- Jeff Dean 在 Google 进行大规模深度学习
- 如今 Etsy 的架构是什么样的?
- 我们如何在 Mail.Ru Cloud 中实现视频播放器
- Twitter 如何每秒处理 3,000 张图像
- 每天可处理数百万个请求的图像优化技术
- Facebook 如何向 80 万同时观看者直播
- Google 如何针对行星级基础设施进行行星级工程设计?
- 为 Mail.Ru Group 的电子邮件服务实施反垃圾邮件的猫捉老鼠的故事,以及 Tarantool 与此相关的内容
- The Dollar Shave Club Architecture Unilever 以 10 亿美元的价格被收购
- Uber 如何使用 Mesos 和 Cassandra 跨多个数据中心每秒管理一百万个写入
- 从将 Uber 扩展到 2000 名工程师,1000 个服务和 8000 个 Git 存储库获得的经验教训
- QuickBooks 平台
- 美国大选期间城市飞艇如何扩展到 25 亿条通知
- Probot 的体系结构-我的 Slack 和 Messenger Bot 用于回答问题
- AdStage 从 Heroku 迁移到 AWS
- 为何将 Morningstar 迁移到云端:降低 97%的成本
- ButterCMS 体系结构:关键任务 API 每月可处理数百万个请求
- Netflix:按下 Play 会发生什么?
- ipdata 如何以每月 150 美元的价格为来自 10 个无限扩展的全球端点的 2500 万个 API 调用提供服务
- 每天为 1000 亿个事件赋予意义-Teads 的 Analytics(分析)管道
- Auth0 体系结构:在多个云提供商和地区中运行
- 从裸机到 Kubernetes
- Egnyte Architecture:构建和扩展多 PB 内容平台的经验教训