# Uber 如何扩展其实时市场平台
> 原文: [http://highscalability.com/blog/2015/9/14/how-uber-scales-their-real-time-market-platform.html](http://highscalability.com/blog/2015/9/14/how-uber-scales-their-real-time-market-platform.html)
![](https://img.kancloud.cn/58/da/58da2ec570db09352a89662fec52606e_215x215.png)
据报道,[优步](https://www.uber.com/)在短短四年中增长了惊人的 [38 倍。 现在,我认为这是第一次,Uber 首席系统架构师](http://www.latimes.com/business/la-fi-0822-uber-revenue-20150822-story.html) [Matt Ranney](https://twitter.com/mranney) 在一个非常有趣且详细的演讲中-[扩展 Uber 的实时市场平台](http://www.infoq.com/presentations/uber-market-platform)- 告诉我们有关 Uber 软件如何工作的很多信息。
如果您对 Surge 定价感兴趣,则不在讨论之列。 我们确实了解了 Uber 的调度系统,如何实现地理空间索引,如何扩展系统,如何实现高可用性以及如何处理故障,包括使用驱动程序电话作为外部分布式存储系统来处理数据中心故障的惊人方式。 复苏。
演讲的整体印象是非常快速的增长之一。 他们做出的许多架构选择都是由于快速发展并试图授权最近组建的团队尽快行动而造成的。 后端已经使用了许多技术,因为他们的主要目标是使团队尽可能快地提高工程速度。
在一个可以理解的混乱(非常成功)的开始之后,Uber 似乎已经学到了很多关于他们的业务以及他们真正需要成功的知识。 他们的早期派遣系统是一个典型的使其工作正常的事情,在更深的层次上假设它仅在移动人员。 现在,Uber 的使命已经发展为可以处理箱子,杂货以及人员,他们的调度系统已经抽象出来,并奠定了非常坚实和智能的架构基础。
尽管马特(Matt)认为他们的体系结构可能有点疯狂,但是在他们的用例中似乎使用了带有八卦协议的一致哈希环的想法。
很难不为 Matt 对工作的真正热情着迷。 在谈到 DISCO,即他们的调度系统时,他激动地说道,这就像是学校里的旅行推销员问题。 这是很酷的计算机科学。 即使解决方案不是最佳解决方案,但它还是由在容错范围内的可扩展组件构建的,实时,真实的规模实用的旅行推销员。 多么酷啊?
因此,让我们看看 Uber 在内部的工作方式。 这是我对 Matt [演讲](http://www.infoq.com/presentations/uber-market-platform) 的演讲:
## 统计信息
* Uber 地理空间指数的目标是每秒写入一百万次。 阅读的倍数。
* 调度系统具有数千个节点。
## 平台
* Node.js
* Python
* Java
* 转到
* iOS 和 Android 上的本机应用程序
* 微服务
* Redis
* Postgres
* MySQL
* [修复](http://basho.com/)
* Twitter 的 Redis 的 [Twemproxy](https://github.com/twitter/twemproxy)
* Google 的 [S2 几何库](https://code.google.com/p/s2-geometry-library/)
* [铃声](https://github.com/uber/ringpop-node) -一致的哈希环
* [TChannel](https://github.com/uber/tchannel) -RPC 的网络复用和成帧协议
* 节俭
## 常规
* Uber 是一个运输平台,用于将骑手与驾驶员伙伴联系起来。
* 挑战:**将动态需求与动态供应实时匹配**。 在供应方,驾驶员可以自由地做他们想做的任何事情。 在需求方,骑手需要时随时需要运输。
* Uber 的 Dispatch 系统是一个实时市场平台,可使用手机将驾驶员与骑手相匹配。
* 除夕是 Uber 一年中最繁忙的时间。
* 容易忘记该行业取得如此巨大进步的速度。 技术的发展是如此之快,以至于最近令人惊奇的事物很快就消失了。 二十三年前,手机,互联网和 GPS 只是科幻小说,而现在我们几乎没有注意到它。
## 体系结构概述
* 驱动这一切的是运行本机应用程序的手机上的骑手和驾驶员。
* 后端主要为手机流量提供服务。 客户通过移动数据和尽力而为的 Internet 与后端对话。 您能想象 10 年前基于移动数据开展业务吗? 我们现在可以做这种事情真是太棒了。 没有使用专用网络,没有花哨的 QoS(服务质量),只有开放的 Internet。
* 客户连接到与驾驶员和骑手相匹配的调度系统,供需。
* Dispatch 几乎完全用 node.js 编写。
* 计划将其移至 [io.js](https://iojs.org/en/index.html) ,但是从那时起,io.js 和 node.js [已合并](http://www.infoworld.com/article/2923081/javascript/reunited-io-js-rejoins-with-node-js.html) 。
* 您可以使用 javascript 做有趣的分布式系统。
* 很难低估**的生产能力,而节点开发人员**非常热情。 他们可以很快完成很多工作。
* 整个 Uber 系统似乎非常简单。 为什么您需要所有这些子系统以及所有这些人? 只要这样,那便是成功的标志。 有很多事情要做,只要看起来很简单,他们就完成了自己的工作。
* **地图/ ETA** (预计到达时间)。 为了使 Dispatch 做出明智的选择,必须获取地图和路线信息。
* 街道地图和历史旅行时间用于估计当前旅行时间。
* 语言在很大程度上取决于要与哪个系统集成。 因此,有 Python,C ++和 Java
* **服务**。 有大量的业务逻辑服务。
* 使用微服务方法。
* 主要用 Python 编写。
* **数据库**。 使用了许多不同的数据库。
* 最古老的系统是用 Postgres 编写的。
* Redis 经常使用。 有些落后于 Twemproxy。 有些是自定义群集系统的背后。
* MySQL
* Uber 正在建立自己的分布式列存储,该存储可编排一堆 MySQL 实例。
* 某些分派服务在 Riak 中保持状态。
* **行程后管道**。 旅行结束后必须进行很多处理。
* 收集评分。
* 发送电子邮件。
* 更新数据库。
* 安排付款。
* 用 Python 编写。
* **金钱**。 Uber 与许多支付系统集成。
## 旧派送系统
* 最初的 Dispatch 系统的局限性是**开始限制公司**的成长,因此必须进行更改。
* 尽管 [Joel Spolsky 说了](http://www.joelonsoftware.com/articles/fog0000000069.html) ,但大部分内容还是重写了整个内容。 其他所有系统都没有被触及,甚至 Dispatch 系统中的某些服务都得以幸存。
* 旧系统是为私人交通设计的,它有很多假设:
* 每辆车一个车手,不适用于 [Uber Pool](https://get.uber.com/cl/uberpool/) 。
* 迁移人员的想法已深入到数据模型和接口中。 这限制了向新市场和新产品的转移,例如转移食品和盒子。
* 原始版本由城市分片。 这对可伸缩性很有好处,因为每个城市都可以独立运行。 但是,随着越来越多的城市被添加,它变得越来越难以管理。 有些城市很大,有些城市很小。 一些城市的负载高峰很大,而其他城市则没有。
* 由于构建速度如此之快,它们没有单点故障,所以它们有多点故障。
## 新派送系统
* 为了解决城市分片问题并支持更多产品的问题,必须将供求的概念推广起来,因此创建了**供应服务和需求服务**。
* 供应服务跟踪所有供应的功能和状态机。
* 要跟踪车辆,有许多属性可以模型化:座椅数量,车辆类型,儿童汽车座椅的存在,轮椅是否可以安装等。
* 需要跟踪分配。 例如,一辆汽车可能有三个座位,但其中两个就被占用了。
* 需求服务跟踪需求,订单以及需求的所有方面。
* 如果骑乘者需要汽车安全座椅,则该要求必须与库存相匹配。
* 如果车手不介意以便宜的价格共享汽车,则必须建模。
* 如果需要移动箱子或运送食物怎么办?
* 满足所有供求关系的逻辑是称为 DISCO(调度优化)的服务。
* 旧系统将仅在当前可用供应量上匹配,这意味着正在等待工作的道路上的汽车。
* DISCO 支持对未来进行规划,并在可用信息时加以利用。 例如,修改正在进行的行程中的路线。
* **按供应商**的地理位置。 DISCO 需要地理空间索引来根据所有供应的位置和预期的位置来做出决策。
* **按需求分配地理位置**。 需求还需要地理索引
* 需要更好的路由引擎来利用所有这些信息。
### 调度
* 当车辆四处行驶时,位置更新将通过供应发送到地理位置。 为了使驾驶员与驾驶员匹配或仅在地图上显示汽车,DISCO 通过供应向地理区域发送请求。
* 按供应商的地理位置会制作一个粗糙的首过滤波器,以获取附近符合要求的候选对象。
* 然后,将清单和需求发送到路由/ ETA,以计算它们在地理上而不是在道路系统附近的距离的 ETA。
* 按 ETA 排序,然后将其发送回供应源,以提供给驾驶员。
* 在机场,他们必须模拟虚拟出租车队列。 必须将供应排队,以考虑到货的顺序。
### 地理空间索引
* 必须具有超级可扩展性。 设计目标是**每秒处理一百万次写入**。 写入速率来自于驱动程序,驱动程序在移动时每 4 秒发送一次更新。
* 读取目标是每秒读取的次数多于每秒写入的次数,因为每个打开应用程序的人都在进行读取。
* 通过简化假设,旧的地理空间指数非常有效,它仅跟踪可调度的供应。 供应的大部分都在忙于做某事,因此可用供应的子集易于支持。 在少数几个进程中,全局索引存储在内存中。 进行非常幼稚的匹配非常容易。
* 在新世界**中,必须跟踪每个状态下的所有供应**。 此外,还必须跟踪其预计路线。 这是更多的数据。
* 新服务**在数百个进程**上运行。
* 地球是一个球体。 单纯基于经度和纬度很难进行汇总和近似。 因此,Uber 使用 Google S2 库将地球分成了微小的单元。 每个单元都有唯一的单元 ID。
* 使用 int64 可以表示地球上每平方厘米。 Uber 会使用 12 级的单元,其大小从 3.31 km(2)到 6.38 km(2),具体取决于您在地球上的哪个位置。 盒子根据它们在球体上的位置而改变形状和大小。
* S2 可以提供形状的覆盖范围。 如果要绘制一个以伦敦为中心,半径为 1 公里的圆,S2 可以告诉您需要哪些单元格才能完全覆盖该形状。
* 由于每个单元都有一个 ID,因此该 ID 被用作分片密钥。 当从供应中获得位置时,将确定该位置的小区 ID。 使用单元 ID 作为分片键,可以更新耗材的位置。 然后将其发送到几个副本。
* 当 DISCO 需要在某个地点附近寻找补给品时,将以骑手所在的位置为中心,计算一个圆的覆盖范围。 使用圆圈区域中的单元 ID,将所有相关的分片联系起来以返回供应数据。
* 全部可扩展。 即使效率不如您期望的那样,并且由于扇出相对便宜,所以可以始终通过添加更多节点来扩展写负载。 通过使用副本来缩放读取负载。 如果需要更多的读取容量,则可以增加复制因子。
* 一个限制是单元格大小固定为 12 级大小。 将来可能会支持动态单元大小。 需要进行权衡,因为像元大小越小,查询的扇出越大。
### 路由
* 从地理空间得到答案后,必须对选项进行排名。
* 有几个高级目标:
* **减少额外的驱动**。 驾驶是人们的工作,因此人们渴望提高生产力。 他们获得额外的出行报酬。 理想情况下,驾驶员应连续行驶。 一堆工作会排队等待,他们将为此获得报酬。
* **减少等待**。 骑手应等待的时间尽可能短。
* **总体 ETA 最低**。
* 旧的系统是让需求搜索当前可用的供应,匹配并完成。 它易于实施且易于理解。 对于私人交通来说,它工作得很好。
* 仅查看当前的可用性无法做出好的选择。
* 的想法是,与正在远处行驶的驾驶员相比,当前正在运送驾驶员的驾驶员可能更适合要求乘车的顾客。 挑选出行驾驶员可以最大程度地减少客户的等待时间,并可以减少远程驾驶员的额外驾驶时间。
* 这种尝试展望未来的模型可以更好地处理动态条件。
* 例如,如果某个驾驶员在客户附近上线,但已经从较远的地方派遣了另一个驾驶员,则无法更改分配决策。
* 另一个示例涉及愿意共享旅程的客户。 通过尝试在非常复杂的场景中预测未来,可以进行更多优化。
* 在考虑运送盒子或食物时,所有这些决定变得更加有趣。 在这些情况下,人们通常还有其他事情要做,因此涉及不同的权衡。
## 缩放调度
* 使用 node.js 构建调度程序。
* 他们正在建立有状态服务,因此无状态扩展方法将行不通。
* Node 在单个进程中运行,因此必须设计某种方法以在同一台计算机上的多个 CPU 上以及多个计算机上运行 Node。
* 有一个关于在 Javascript 中重新实现所有 Erlang 的笑话。
* 用于扩展 Node 的解决方案是 *ringpop* ,这是一种具有八卦协议的一致哈希环,实现了可扩展的,容错的应用程序层分片。
* 在 CAP 术语中,ringpop 是 **AP 系统**,为了获得可用性而进行交易。 最好说明一些不一致之处,而不是提供停机服务。 最好起床并偶尔出错。
* 铃声是每个 Node 进程中都包含的可嵌入模块。
* 节点实例在成员资格集周围闲聊。 一旦所有节点都同意谁是谁,他们就可以独立有效地做出查找和转发决策。
* 这确实是可扩展的。 添加更多流程,完成更多工作。 它可用于分片数据,或用作分布式锁定系统,或协调 pub / sub 或长轮询套接字的集合点。
* 八卦协议基于 [SWIM](https://www.cs.cornell.edu/~asdas/research/dsn02-swim.pdf) 。 已经进行了一些改进以缩短收敛时间。
* 闲聊的成员列表随处可见。 随着添加更多节点,它是可伸缩的。 SWIM 中的“ S”是可扩展的,确实有效。 到目前为止,**已扩展到数千个节点。**
* SWIM 将健康检查与成员身份更改结合在一起,作为同一协议的一部分。
* 在铃声系统中,所有这些 Node 进程都包含铃声模块。 他们八卦当前成员。
* 在外部,如果 DISCO 要消耗地理空间,则每个节点都是等效的。 选择一个随机的健康节点。 请求到达的任何地方都负责使用哈希环查找将请求转发到正确的节点。 看起来像:
![20783449993_8e0e0491df.jpg](https://img.kancloud.cn/a3/3e/a33e30d87424652b37717397cd37f3c8_500x230.png)
* 使所有这些跃点和对等体互相交谈可能听起来很疯狂,但是它会产生一些非常好的属性,例如可以通过在任何计算机上添加实例来扩展服务。
* ringpop 是基于 Uber 自己的称为 *TChannel* 的 RPC 机制构建的。
* 这是一个双向请求/响应协议,其灵感来自 Twitter 的 [Finagle](https://twitter.github.io/finagle/) 。
* 一个重要的目标是控制许多不同语言的性能。 特别是在 Node 和 Python 中,许多现有的 RPC 机制无法很好地发挥作用。 想要 redis 级性能。 **TChannel 已经比 HTTP** 快 20 倍。
* 想要高性能的转发路径,以便中间人可以非常轻松地做出转发决策,而不必了解完整的有效负载。
* 希望进行适当的流水线处理,以免出现线头阻塞,请求和响应可以随时沿任一方向发送,并且每个客户端也是一台服务器。
* 希望引入有效负载校验和和跟踪以及一流的功能。 每个请求遍历系统时都应该是可跟踪的。
* 想要从 HTTP 清除迁移路径。 HTTP 可以非常自然地封装在 TChannel 中。
* **Uber 退出了 HTTP 和 Json 业务**。 一切都在通过 TChannel 进行节俭。
* 铃声正在通过基于 TChannel 的持久连接进行所有八卦。 这些相同的持久连接用于扇出或转发应用程序流量。 TChannel 也用于服务之间的通话。
## 派送可用性
* **可用性很重要**。 优步拥有竞争对手,转换成本非常低。 如果 Uber 暂时倒闭,那笔钱就会流向其他人。 其他产品的粘性更大,客户稍后会再试。 Uber 不一定是这样。
* **使所有内容均可重试**。 如果某些操作无效,则必须重试。 这就是解决故障的方法。 这要求所有请求都是幂等的。 例如,重试发送不能将它们发送两次或对某人的信用卡收取两次费用。
* **使所有东西都可以杀死**。 失败是常见的情况。 随机杀死进程不应造成损害。
* **仅崩溃**。 没有正常关机。 正常关机不是必需的做法。 当意外情况发生时,需要练习。
* **小块**。 为了最大程度地减少失败带来的损失,请将它们分成更小的部分。 可能可以在一个实例中处理全局流量,但是当该流量消失时会发生什么呢? 如果有一对,但其中一个发生故障,则容量将减少一半。 因此,服务需要分解。 听起来像是技术问题,但更多是文化问题。 拥有一对数据库会更容易。 这是很自然的事情,但是配对不好。 如果您能够自动升级一个并重新启动新的辅助节点,则随机杀死它们是非常危险的。
* **杀死所有东西**。 甚至杀死所有数据库,以确保有可能幸免于此类失败。 这就需要改变使用哪种数据库的决策,他们选择了 Riak 而不是 MySQL。 这也意味着使用铃声而不是 redis。 杀死 redis 实例是一项昂贵的操作,通常,删除它们的规模很大而且代价很高。
* **将其分解为较小的块**。 谈论文化转变。 通常,服务 A 将通过负载平衡器与服务 B 对话。 如果负载均衡器死了怎么办? 您将如何处理? 如果您从不走那条路,那您将永远不会知道。 因此,您必须终止负载均衡器。 您如何绕过负载均衡器? 负载平衡逻辑必须放在服务本身中。 客户需要具有一定的智能才能知道如何解决问题。 这在哲学上类似于 Finagle 的工作方式。
* 为了使整个系统扩展并处理背压,已经从一系列的 poppop 节点中创建了一个服务发现和路由系统。
## 总数据中心故障
* 这种情况很少发生,但是可能会发生意外的级联故障,或者上游网络提供商可能会发生故障。
* Uber 维护着一个备份数据中心,并安装了交换机以将所有内容路由到备份数据中心。
* 问题是进程内旅行的数据可能不在备份数据中心中。 他们不是使用复制数据,而是使用驾驶员电话作为行程数据的来源。
* 发生的情况是调度系统**定期向驱动器电话**发送加密的状态摘要。 现在,假设有一个数据中心故障转移。 下次驾驶员电话向 Dispatch 系统发送位置更新时,Dispatch 系统将检测到该行程不知道,并向州政府索要状态摘要。 然后,派遣系统会根据状态摘要进行自我更新,并且旅行就像没有发生一样继续进行。
## 不利之处
* Uber 解决可扩展性和可用性问题的方法的弊端是潜在的高延迟,因为 Node 进程之间相互转发请求并发送扇出的消息。
* 在扇出系统中,微小的斑点和毛刺会产生惊人的巨大影响。 系统中的扇出程度越高,发生高延迟请求的机会就越大。
* 一个好的解决方案是通过跨服务器取消来拥有**备份请求。 这是 TChannel 的一流功能。 将请求与信息一起发送到服务 B(2)的请求一起发送到服务 B(1)。 然后,稍后将请求发送到服务 B(2)。 B(1)完成请求后,将取消 B(2)上的请求。 有了延迟,这意味着在通常情况下 B(2)没有执行任何工作。 但是,如果 B(1)确实失败了,那么 B(2)将处理该请求并以比首先尝试 B(1),发生超时然后再尝试 B(2)更低的延迟返回响应。**
* 请参见 [Google 延迟容忍系统:将不可预测的部分](http://highscalability.com/blog/2012/6/18/google-on-latency-tolerant-systems-making-a-predictable-whol.html) 制成可预测的整体,以获取更多背景知识。
## 相关文章
* [关于 HackerNews](https://news.ycombinator.com/item?id=10216019)
* [S2map.com](http://s2map.com/) -请参见 S2 覆盖率和绘制形状
感谢您写这篇文章。 令人着迷的阅读!
很棒的文章,非常有趣,并深入研究@uber 工作中的思想过程。
- 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 内容平台的经验教训