# Vinted 体系结构:每天部署数百次,以保持繁忙的门户稳定
> 原文: [http://highscalability.com/blog/2015/2/9/vinted-architecture-keeping-a-busy-portal-stable-by-deployin.html](http://highscalability.com/blog/2015/2/9/vinted-architecture-keeping-a-busy-portal-stable-by-deployin.html)
![](https://img.kancloud.cn/5c/3d/5c3df8465fc2f3d17abd25ea2143021a_122x122.png)
*这是 [Vinted](https://www.vinted.com/) 的 [NerijusBendžiūnas](https://www.linkedin.com/profile/view?id=48589106)和 [Tomas Varaneckas](https://twitter.com/spajus) 的来宾帖子。*
[Vinted](https://www.vinted.com/) 是一个对等市场,用于出售,购买和交换衣服。 它允许成员直接通信,并具有社交网络服务的功能。
它始于 2008 年,最初是一个立陶宛女孩的小社区,后来发展成为一个全球性项目,为 8 个不同国家/地区的 700 万用户提供服务,并且这一需求正在不断增长,每天处理超过 2 亿个请求。
## 统计资料
* 700 万用户,并且还在不断增长
* 每月 250 万活跃用户
* 每天 2 亿个请求(浏览量+ API 调用)
* 9.3 亿张照片
* 80 TB 原始空间用于图像存储
* 60 TB HDFS 原始空间用于分析数据
* 70%的流量来自移动应用(API 请求)
* 每位成员每周花费 3 个小时以上的时间
* 2500 万个上市项目
* 超过 220 台服务器:
* 47 用于内部工具(vpn,厨师,监视,开发,制图,构建,备份等)
* Hadoop 生态系统 38
* 34 用于图像处理和存储
* 独角兽和微服务 30
* 28 个用于 MySQL 数据库,包括副本
* 19 用于狮身人面像搜索
* 10 个用于背景工作
* 10 用于使用 Nginx 进行负载平衡
* 卡夫卡 6
* Redis 4
* 4 用于电子邮件传递
## 技术栈
### 第三方服务
* [GitHub](https://github.com/) ,用于代码,问题和讨论
* [NewRelic](http://newrelic.com/) 用于监视应用程序响应时间
* [CloudFlare](https://www.cloudflare.com/) 用于 DDoS 保护和 DNS
* [Amazon Web Services](http://aws.amazon.com/) (SES,Glacier),用于通知和长期备份
* [闲暇](https://slack.com/)用于工作对话和“聊天操作”
* [Trello](https://trello.com/) 完成任务
* [Pingdom](http://pingdom.com/) 用于正常运行时间监控
### 核心应用和服务
* [Ruby](https://www.ruby-lang.org/) 用于服务,脚本和主应用
* [主应用程序和内部应用程序的 Rails](http://rubyonrails.org/)
* [独角兽](http://unicorn.bogomips.org/)服务于主应用
* [Percona MySQL 服务器](http://www.percona.com/software/percona-server/ps-5.6)作为主数据库
* [Sphinx 搜索](http://sphinxsearch.com/)用于全文搜索并减少 MySQL 的负载(测试 [ElasticSearch](http://www.elasticsearch.org/) )
* [Capistrano](http://capistranorb.com/) 用于部署
* [Jenkins](http://jenkins-ci.org/) 用于运行测试,部署和其他各种任务
* [Memcached](http://memcached.org/) 用于缓存
* [请求](http://resquework.org/)进行后台作业
* [Redis](http://redis.io/) 用于 Resque 和 Feed
* [RabbitMQ](http://www.rabbitmq.com/) 用于将消息传递到服务
* [HAproxy](http://www.haproxy.org/) 提供高可用性和负载平衡
* [GlusterFS](http://www.gluster.org/) 用于分布式存储
* [Nginx](http://nginx.org/) 投放 Web 请求
* [Apache Zookeeper](http://zookeeper.apache.org/) 用于分布式锁定
* [Flashcache](https://github.com/facebook/flashcache/) 可提高 I / O 吞吐量
### 数据仓库堆栈
* [Clojure](http://clojure.org/) 用于数据提取服务
* [Apache Kafka](http://kafka.apache.org/) ,用于存储飞行中的数据
* [Camus](https://github.com/linkedin/camus) 用于将数据从 Kafka 卸载到 HDFS
* [Apache Hive](https://hive.apache.org/) 作为 SQL-on-Hadoop 解决方案
* [Cloudera CDH](http://www.cloudera.com/content/cloudera/en/products-and-services/cdh.html) Hadoop 发行版
* [Cloudera Impala](http://www.cloudera.com/content/cloudera/en/products-and-services/cdh/impala.html) 作为低延迟 SQL-on-Hadoop 解决方案
* [Apache Spark](https://spark.apache.org/) 处于实验阶段
* [Apache Oozie](http://oozie.apache.org/) 作为工作流调度程序(研究替代方案)
* [扩展](https://github.com/twitter/scalding)用于数据转换
* [Avro](http://avro.apache.org/) 用于数据序列化
* [Apache Parquet](http://parquet.incubator.apache.org/) 用于数据序列化
### 服务器和资源调配
* 多为裸金属
* 多个数据中心
* [CentOS](http://www.centos.org/)
* [厨师](https://www.chef.io/)用于配置几乎所有内容
* [Berkshelf](http://berkshelf.com/) ,用于管理 Chef 依赖项
* [测试厨房](http://kitchen.ci/),用于在 VM 上运行基础结构测试
* [Ansible](http://www.ansible.com/) 用于滚动升级
### 监控方式
* [Nagios](http://www.nagios.org/) 用于常规操作监控
* [仙人掌](http://www.cacti.net/)用于图形和容量规划
* [Graylog2](https://www.graylog2.org/) 适用于应用程序日志
* 用于服务器日志的 [Logstash](http://logstash.net/)
* [Kibana](http://www.elasticsearch.org/overview/kibana/) 用于查询 logstash
* [统计信息](https://github.com/etsy/statsd),用于从应用程序收集实时指标
* [石墨](http://graphite.wikidot.com/),用于存储应用程序中的实时指标
* [Grafana](http://grafana.org/) 用于创建带有应用指标的精美仪表板
* [集线器](https://hubot.github.com/)用于基于聊天的监视
## 架构概述
* 裸机服务器被用作云提供商的更便宜,更强大的替代产品。
* 在欧洲和美国的 3 个不同数据中心托管服务器。
* Nginx 前端将 HTTP 请求路由到独角兽工作者并执行 SSL 终止。
* [Pacemaker](http://clusterlabs.org/) 用于确保 Nginx 服务器的高可用性。
* 在不同的国家/地区,每个 Vinted 门户网站都有自己单独的部署和资源集。
* 为了提高机器利用率,属于多个门户的大多数服务可以在单个裸机服务器上彼此并行运行。 主厨配方负责唯一的端口分配和其他分离问题。
* 通过为每个门户网站使用单独的数据库来避免 MySQL 分片。
* 在我们最大的门户中,功能性分片已经在发生,距离单个最大表无法容纳在服务器中的点还差几个月。
* Rails 应用程序中的缓存使用带有 L2 缓存的自定义机制,可以防止主缓存过期时出现峰值。 使用了几种缓存策略:
* 远程(在 memcached 中)
* 本地(在独角兽工作者的记忆中)
* 半本地(在独角兽工作器内存中,当本地缓存到期时回退到 memcached)。
* 围绕核心 Rails 应用程序构建了几个微服务,它们都有明确的用途,例如发送 iOS 推送通知,存储和提供品牌名称,存储和提供标签。
* 微服务可以是按端口,按数据中心或全局的。
* 每个微服务的多个实例正在运行以实现高可用性。
* Nginx 平衡了基于 HTTP 的微服务。
* 使用 Redis 实现每个成员的自定义 feed。
* 使用过滤器(自定义大小,颜色等)时,从 Sphinx 索引而不是 MySQL 加载目录页面。
* 图像由单独的 Rails 应用处理。
* 处理后的图像存储在 GlusterFS 中。
* 第 3 次匹配后会缓存图片,因为前几次匹配通常来自上传者,并且图片可能会旋转。
* 使用 [twemproxy](https://github.com/twitter/twemproxy) 分割 Memcached 实例。
## 球队
* 超过 150 名全职员工
* 30 位开发人员(后端,前端,移动)
* 5 名现场可靠性工程师
* 立陶宛维尔纽斯的总部
* 在美国,德国,法国,捷克共和国和波兰设有办事处
## 公司的运作方式
* 几乎所有信息对所有员工开放
* 使用 GitHub 进行几乎所有操作(包括讨论公司问题)
* Slack 中的实时讨论
* 每个人都可以自由参加他们感兴趣的事情
* 自治队
* 没有资历等级
* 跨职能开发团队
* 没有强制执行的流程,团队可以决定如何管理自己
* 团队致力于解决高层问题,并决定如何解决它们
* 每个团队都决定如何,何时何地工作
* 团队在需要时自行雇用
## 开发周期
* 开发人员从主人处分支。
* 更改成为 GitHub 中的请求请求。
* Jenkins 运行 [Pronto](https://github.com/mmozuras/pronto) 进行静态代码和样式检查,在 pull request 分支上运行所有测试,并使用状态更新 GitHub pull request。
* 其他开发人员查看更改,添加评论。
* 拉取请求可能会使用各种修复程序多次更新。
* 每次更新后,Jenkins 都会运行所有测试。
* 在与 master 合并之前清理 Git 历史,以保持 master 历史的简洁性。
* 接受的请求请求将合并到主服务器中。
* Jenkins 使用所有测试运行主版本,并触发部署作业以推出新版本。
* 几分钟后,代码到达 master 分支后,将其应用于生产中。
* 拉取请求通常很小。
* 每天部署约 300 次。
## 避免失败
每天部署数百次并不意味着总是必须破坏所有东西,但是保持站点稳定需要一定的纪律。
* 如果测试失败,则不会进行部署。 没有方法可以覆盖它,母版必须为绿色才能进行部署。
* 每天晚上和周末自动部署锁定。
* 任何人都可以通过 Slack 聊天手动锁定部署。
* 部署锁定后,可以从 Slack 聊天中手动“强制”部署。
* 在审查代码时,团队非常挑剔。 质量标准设置得很高。 测试是强制性的。
* 在 Unicorn 重新加载代码之前,将在生产中进行预热。 它包括对门户网站各个关键部分的若干请求。
* 在预热期间,如果任何一个请求均未返回 200 OK,则旧代码将保留,并且部署将失败。
* 有时,测试/预热未发现问题,并且已损坏的代码发布到了生产环境中。
* 错误将流式传输到 Graylog 服务器。
* 如果错误率超过阈值,则会触发警报。
* 错误率警报和失败的构建通知会立即报告给 Slack 聊天。
* 所有错误都包含额外的元数据:Unicorn worker 主机和 pid,HTTP 请求详细信息,导致问题的代码的 git 修订版,错误回溯。
* 某些类型的“致命”错误也直接报告给 Slack 聊天。
* 每个部署日志都包含带有所有更改的 GitHub 差异 URL。
* 如果生产中出现问题,由于变更集和即时错误反馈的原因,很容易快速查明问题。
* 部署详细信息会报告给 NewRelic,从而可以轻松解决性能瓶颈的引入。
## 减少生产时间
快速发布和稳定发布都非常受关注,团队一直在努力使构建和部署时间尽可能短。
* 完整的测试套件包含> 7000 个测试,运行时间约为 3 分钟。
* 不断添加新的测试。
* Jenkins 在具有 32 个 CPU,128G RAM 和 SSD 驱动器的裸机上运行。
* Jenkins 将所有测试分成多个块,并并行运行它们,以汇总最终结果。
* 在没有并行化的情况下,测试将在一台普通计算机上运行 1 个小时以上。
* 在 Jenkins 中,对于 master 分支中的每次提交,Rails 资产都是预先构建的。
* 在部署期间,从 jenkins 下载预建资产,并将其上载到所有目标服务器。
* 将版本上载到目标服务器时使用 BitTorrent。
## 运行实时数据库迁移
在大多数情况下,即使在高峰时间,我们也可以在不停机的情况下更改生产 MySQL 数据库的结构。
* 在任何部署期间都可能发生数据库迁移
* Percona 工具箱的 pt-online-schema-change 用于在表的副本上运行更改,同时使其与原始副本保持同步,并在更改完成后将副本与原始副本切换
# 运作方式
## 服务器配置
* Chef 用于提供我们基础架构的几乎所有方面。
* SRE 团队确实会提出对基础结构更改的请求,就像开发团队对代码更改所做的一样。
* 詹金斯(Jenkins)正在验证所有 Chef 拉取请求,运行交叉依赖关系检查,食品评论等。
* 团队在 GitHub 上审查了厨师代码的更改。
* 开发人员可以向 Chef 存储库发出基础结构更改请求请求。
* 合并拉取请求时,Jenkins 上载更改后的 Chef 食谱并将其应用于生产中。
* 计划产生 DigitalOcean 小滴以与 Jenkins 一起进行 Chef 厨房测试。
* Jenkins 本身是使用 Chef 配置的,而不是使用 Web UI。
## 监控方式
* 仙人掌图服务器端指标
* Nagios 检查可能出现的所有故障
* Nagios 健康检查,用于我们的某些应用程序和服务
* Statsd / Graphite,用于跟踪应用程序指标,例如成员登录,注册,数据库对象创建
* Grafana 用于漂亮的仪表板
* 可以使用 Chef 动态描述和创建 Grafana 仪表板
## 聊天操作
* Hubot 坐在 Slack 中。
* 松弛房间通过 [hubot-pubsub](https://github.com/spajus/hubot-pubsub) 订阅了各种事件通知。
* #deploy 会议室显示有关部署的信息,并提供指向 GitHub diff,Jenkins 控制台输出等的链接。在这里,可以使用简单的聊天命令来触发,锁定和解锁部署。
* #deploy-fail 会议室仅显示部署失败。
* #failboat 会议室显示有关错误率和生产中个别错误的公告。
* 有多个#failboat- *房间,其中提供有关 cron 故障,卡住的 resque 作业,nagios 警告,newrelic 警报的信息。
* 每天两次将 Graylog 错误与 GitHub 进行处理和交叉检查,生成报告并将其提交给开发团队。
* 如果有人在 GitHub 上提到您,Hubot 会在 Slack 上的私人消息中为您提供该问题的链接。
* 在 GitHub 中创建问题或请求请求时,提到的团队会在其适当的 Slack 会议室中收到 ping 命令。
* 可以通过 Hubot 在 Slack 聊天中查询并显示石墨图。
* 您可以向 Hubot 询问有关基础设施的问题,即有关部署特定服务的机器的问题。 Hubot 查询 Chef 服务器以获取数据。
* 开发人员将 Hubot 通知用于我们应用中发生的某些事件。 例如,向客户支持聊天室自动通知可能的欺诈案件。
* Hubot 与 Office [netatmo](https://www.netatmo.com/) 模块集成在一起,可以告诉所有人什么是 CO2,噪声,温度和湿度水平。
# 数据仓库堆栈
* 我们从两个来源提取数据:
* 网站事件跟踪数据:印象数,点击数等
* 数据库(MySQL)更改。
* 大多数事件跟踪数据都从 JavaScript / Android / iOS 前端应用程序发布到 HTTP 端点。 一些事件由我们的核心 Ruby on Rails 应用程序发布到本地 UDP 套接字。 我们选择 UDP 以避免阻塞请求。
* 有一种服务可以监听 UDP 套接字上的新事件,对它们进行缓冲,并定期在 Kafka 中发出原始事件的主题。
* 流处理服务使用原始事件主题,验证事件,将它们编码为 Avro 格式,然后发出特定于事件的主题。
* 我们将事件的 Avro 模式保存在单独的集中式模式注册表服务中。
* 无效事件被置于单独的 Kafka 主题中,以进行可能的更正。
* 我们使用 LinkedIn 的 Camus 作业将事件从特定于事件的主题逐步转移到 HDFS。 事件到 Hadoop 的时间通常最多为一个小时。
* 使用 Hive 和 Impala 进行临时查询和数据分析。
* 研究基于伸缩的数据处理解决方案。
* 报告使用我们内部开发的,用 Ruby 编写的类似 OLAP 的报告系统运行。
# 得到教训
## 产品开发
* 投资代码质量。
* 通过测试涵盖所有内容。
* 发布小更改。
* 使用功能开关将未完成的功能部署到生产中。
* 开发某些东西时,不要保留长时间运行的代码分支。
* 投资一个快速的发布周期。
* 首先构建移动产品。
* 设计 API 从一开始就很好,以后很难更改。
* 在 RabbitMQ 消息中包含发件人主机名和应用程序名称可以节省生命。
* 不要猜测或做假设,请进行 [AB](https://github.com/vinted/ab) 测试并检查数据。
* 如果您打算将 Redis 用于更大的事情,请从一开始就考虑分片。
* 如果您计划使 Rails 保持最新状态,则切勿使用叉状和稍作修饰的红宝石宝石。
* 通过社交网络尽可能轻松地共享您的内容。
* 搜索引擎优化是一项全职工作。
## 基础设施和运营
* 经常部署以提高系统稳定性。 起初听起来可能违反直觉。
* 自动化一切。
* 监视所有可能发生的故障。
* 网络交换缓冲区很重要。
* 容量规划很困难。
* 从一开始就考虑 HA。
* RabbitMQ 集群不值得付出努力。
* 测量并绘制所有图形:HTTP 响应时间,Resque 队列大小,模型持久率,Redis 响应时间。 您无法改善无法衡量的东西。
## 数据仓库堆栈
* Hadoop 生态系统中有许多工具。 很难选择合适的。
* 如果您正在为 Hive 编写用户定义函数(UDF),那么该考虑使用非 SQL 解决方案进行数据转换了。
* “ Hadoop 应用程序”概念含糊不清。 通常,我们需要手动将应用程序组件粘合在一起。
* 每个人都编写自己的工作流管理器。 并且有充分的理由。
* 分布式系统监视非常困难。 异常检测和作图很有帮助。
* 核心 Hadoop 基础架构(HDFS,YARN)坚如磐石,但较新的工具通常会有细微差别。
* 卡夫卡很棒。
这个网站是关于高可扩展性还是如何浪费服务器? 您是否真的需要 220 台服务器来服务〜2300req / sec?
他了解了其中一些服务器使用情况。 这是 Ruby on Rails,所以这就是原因。
您能否详细说明“ RabbitMQ 集群不值得付出”? 您在运行时遇到问题吗?
@Peter-与其他高可用性站点一样,它们可以使用少于十个服务器来为流量提供服务。
从文章看来-其余内容涉及(a)收集和分析数据; (b)监督和监督系统; (c)确保高可用性。
在三个区域中只有 10 台边缘(缓存/ nginx)服务器(由于 HA,30 台独角兽是自然扩展)。 鉴于流量不统一(因此 200M req / day 不能转换为 2300 req / s),这似乎是适中的,因为在任何区域中,请求都只能由几个端点服务器之一来处理。 再次-这就是您在 HA 设置中所期望的-2 个以上的服务器用于任何潜在的传入(请求)请求。
我必须同意彼得的观点。 在最近阅读了此处的 Stack Exchange 文章之后,很难不认为此设置会浪费一些资源。
感谢分享。
您似乎正在使用大量的开源项目。 我对你的决定感到好奇。 团队成员一开始是否已经熟悉大多数技术? 如果没有,那么在这么多方面加强工作是否有点势不可挡?
大家好,
Vaidotas,这里的 Vinted 工程师之一。
想对服务器数量发表评论。 如果您查看详细信息,将会看到很多服务器专用于分析数据收集。 而且我认为分析数据可能是单独的主题。
如果您查看运行 Vinted 应用程序所需的服务器及其所有内容,则会看到以下内容:
34 个用于图像处理和存储(9.3 亿张照片)
30 个用于 Unicorn 和微服务(每天 2 亿个请求)
28 个用于 MySQL 数据库,包括副本
19 个用于 Sphinx 搜索(2500 万个列出的项 索引)
10,用于可处理的后台作业
10,用于与 Nginx 进行负载平衡(充当代理和一些缓存,可能会更少,但在我们运营所在的不同国家/地区需要它们)。
Redis 4
因此,这就是 135 台运行应用程序基础结构的服务器。 现在请记住,所有内容都必须具有高可用性。 这意味着至少所有内容的 2 倍,即使您目前不需要/不使用它也是如此。
希望能解释一下服务器数量。
另外,您的行动小组的规模如何,才能维持这种运营/基础架构? 仅列出了 SRE。5\. DevOps 工程师,系统管理员和/或 DBA 怎么样?
您的 Jenkins 并行化设置似乎很有趣。 你是如何做到的? 也许不久之后还会有另一篇专门针对此的博客文章?
乔恩,我们有 5 位站点可靠性工程师来维护所有基础架构。 我们执行从服务器引导到数据库管理的所有工作。 我们严重依赖自动化:)
我真正无法理解的是-每天 200 M 的请求如何转换为实际的 Internet 流量? StackExchange 的请求量为 1.5 亿,在 Alexa 评分中排名第 53,vinted.com 在 38763 上排名较高,但 RPS 较高。
与 http://highscalability.com/blog/2014/11/10/nifty-architecture-tricks-from-wix-building-a-publishing-pla.html(wix)相同-他们要求 700M 请求/ 一天,但肯定无法将 Alexa 评级与 StackExchange 相比。
谁能澄清?
@tao,一开始只有一个开发人员(CEO,联合创始人),而且技术堆栈要小得多。 您的问题的答案是否定的。
当项目开始发展时,出现了一些东西。 我们雇用了更多的开发人员,工程师等。我们选择雇用最聪明的工程师。 之所以使用某些技术是因为他们具有经验,而其他技术则是“试验和错误”(尤其是大数据的东西)。 我们在解决问题的过程中一直在解决它们。 我们仍然有需要解决的问题。 这就是新技术出现的方式。 我相信,一年后,我们可以写一篇关于我们如何做事的文章。
@lan:RabbitMQ 非常棒,我们正在使用它,但是在分析事件方面,我们遇到了一些限制,因此选择 kafka 作为事件发射。 RabbitMQ 集群的东西很容易破解。 正如文档所述-“ RabbitMQ 群集不能很好地容忍网络分区”,这并不像我们希望的那样罕见。
@Tim:我们使用 https://github.com/grosser/parallel_tests 的稍加修改版本
@安东:不确定“转换”的含义,但我们为女孩提供了超过 10 Gigs 的流量。 在谈论 Alexa 时,目前我们有 8 个不同的国家,例如,我们的一个国家(http://kleiderkreisel.de)的排名为 7,468,因此没有一个汇总排名。 另一件事是,70%的流量来自移动应用程序,我不确定 Alexa 是否会对此进行计数。
希望大家,Vinted 回答了您所有的问题:)
- 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 内容平台的经验教训