Shopify构建分布式可扩展应用的最佳实践

本文讲的是Shopify构建分布式可扩展应用的最佳实践,【编者的话】在构建大型分布式系统应用时,如何降低不同部分之间的依赖,增强系统的弹性,电商解决方案提供商 Shopify 给出了解决方法。

@Container大会,专为一线开发者和运维工程师设计的顶级容器技术会议。

本文介绍了 Shopify 构建弹性平台的方法。这篇文章不仅读起来有意思,而且你可以把它运用到实践中,构建自有的弹性平台。

Shopify 面临的扩展挑战

电商解决方案提供商 Shopify 每个月的独立访问用户大约有 3 亿。注意,这些用户访问并不是均匀分布的。

其中一个最大的挑战是“闪购”,即最流行的那些网店在特定时间内的销售活动。

例如, Kanye West 开卖新款鞋子。加上 Kim Kardashian ,他们在 Twitter 上有 5,000 万粉丝。

有些客户还在超级碗上打广告。因此, Shopify 根本无法预期届时有多大的访问流量。想想这种情况:在 3 点, 200,000 访客一涌而入,参与几小时后就会结束的特卖活动。

Shopify 该如何扩展,以应对突然增加的访问?即使扩展后不能很好地应对某一场特卖,那么怎么确保这场特卖不会影响其它网店呢?在下一节,我们首先介绍 Shopify 的应用架构,然后以此为背景,深入地讨论上述问题。

Shopify 应用架构

去年, Shopify 全面采用 Docker ,但是仍然采用单体的应用架构。 Simon 告诉我,之所以这么做,是因为转向微服务架构的代价不低。当然,由于全面采用 Docker ,如果他们将来决定转向微服务架构,也比较容易。

总之, Shopify 的架构大致是这样的:应用请求首先发送到 Nginx ,然后再转发到服务器应用集群,每个服务器应用是一个运行 Rails 应用的 Docker 容器。

在数据层,他们用到了:

  • Memcached
  • Redis
  • ElasticSearch
  • MySQL
  • Kafka
  • ZooKeeper

大部分软件运行自有的硬件上,少部分运行在 AWS 上。

为了减少成本, Shopify 运营了一个多租户平台,即不同的网店可能运行在同一台服务器上——例如, shopA.com 和 shopB.com 运行在一台服务器上。

虽然全面转向 Docker 并非一帆风顺,但是最终获得了下列好处:

只需大约 5 分钟,就能运行完数十万行 Ruby 代码的持续集成(没用 Docker 之前需要 15 分钟),部署到横跨 3 个数据中心的 300-400 台服务器上只需 3 分钟(以前需要 15 分钟)。多么令人印象深刻的成效。

如何处理流量激增

平台最好自己就能处理访问的激增。不过,这还没完全实现,在每次大型售卖之前,他们运行一系列的性能检测。

以上面的 Kanye West 为例,他们提前花了两周的时间,把平台的关键部分组合在一起,进行广泛的被动负载测试和性能优化。

为了运行不同的测试,他们用到了弹性矩阵:

(摘自 Simon 的大会报告

在某项服务失效时,弹性矩阵有助于搞清楚系统出了什么问题。

假设 Redis 服务不可用了。从弹性矩阵可以看出, Redis 是买单服务的一部分。这时候,是不是要整个网站下线,进入维护状态呢?当然不,可以让每个用户登出网站,仍然允许他们在没有客户账户的情况下继续买单。然后,一旦 Redis 服务恢复了,将电子邮件地址与客户账户关联,据此补上此前缺少的信息。

依次下线每一个服务(像网店前端、管理面板、API等等),看看此时系统的运行情况——这是否影响到系统的其它部分?尽量去掉服务之间的依赖,整个应用的弹性会因此显著地增加。这好比一条拉链,最弱的那一环决定了应用的健壮程度。

Shopify 开源了与之相关的两个工具: Toxiproxy 和 Semian 。

Toxiproxy 能够控制系统的延迟。

Semian 用于检验系统是否存在单点失效

更多细节,请看 Simon 的大会报告,非常有意思的一个报告。

在弹性平台之上,由于 Shopify 拥有自己的硬件,它能够做到超额配置。对他们而言,这种解决方案很便宜,但是还是比在云上运行花费高。请仔细比较相应的代价和收益,确定这种方案是否适合你的需求。

数据存储的扩展是另外一个巨大的挑战。由于 Shopify 处理的是金融交易,他们的数据库必须保持同步。解决方案是什么呢? 两年前 Shopify 就开始实施 MySQL 分片了。他们非常激进,力求经过一段时间后把数据库切分成更多更小的切片。

Simon 随即说道,数据库的扩展尤其是切片是相当难的。不到最后,别采用数据库切片,尽可能地利用缓存。采用切片后的一个好处是有助于事故的隔离。如果在某个切片中某个客户的数据发生灾难,也只会影响整个平台的一小部分。

说到对弹性的测试, Simon 强调说有了弹性平台和自动灾后恢复机制,大部分数据库扩展问题都已经被解决了。

接下来,他们准备提高哪些方面?

接下来, Shopify 团队正在审视应用之间的隔离问题。另外一个主要问题是如何让网店同时运行在位于不同大洲的多个数据中心上。这不仅非常有利于保证数据本地性,也能避免意外事件的影响。

我访问 Jeremy Edberg 时,他说过 Netflix 也投入很多资源研究如何避免意外事件的影响。

除此之外,他们也在研究如何实现一天内的多次灾后恢复。在访谈 Simon 的页面,你能了解到他们如何在整个数据中心进行灾后恢复测试。

目前,如果要实现整个数据中心的灾后恢复,就不得不临时关闭买单服务。他们正在寻找相关的解决方案。

采取的行动

本文的目的是为读者提供行动指南。现在,你能做什么呢?是避免切片,更多地使用缓存吗?由于成本的原因,你可能无法超额配置,但是总可以检查一下弹性矩阵吧?即使现在还没有资源做这些事情,构建一个弹性矩阵,或者仅仅思考一下弹性的问题,也是有帮助的。

如果你觉得上述挑战很有意思,告诉你, Shopify 正在招人。

你最依赖的系统是什么?不妨在评论中与我们分享哦。

原文链接:Inside engineering: Make your apps resilient, the Shopify way (翻译:柳泉波)

原文发布时间为: 2015-11-08

本文作者:bnuhero 

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:Shopify构建分布式可扩展应用的最佳实践

时间: 2024-09-12 06:16:18

Shopify构建分布式可扩展应用的最佳实践的相关文章

优化分布式团队的八个最佳实践

如今,越来越多的企业的团队成员并不是工作在同一个屋檐下,那么企业将如何确保其分布式团队取得成功呢? 有些人坚持认为企业成功的唯一方法,就是朝九晚五的小群体的团队成员搭配:没有远程工作团队,总是在同一个房间里面对面地工作. 虽然人们不知道工作人员居所在何处,但开展远程工作完全是可行的,因此管理分布式团队是生活中的一个事实.特别是对于那些将成长为一个全球性的企业,有很多是采用这样的形式. 大多数情况下,企业的团队工作在同一个屋檐下是理想的认同,但大部分的时间不是这样的.那么,我们如何更好地在远程开展

RESTful JSON Web服务最佳实践

本文讲的是RESTful JSON Web服务最佳实践,[IT168 资讯]Collaxa BPEL产品-后来成为Oracle SOA战略核心的一部分-背后的关键人物之一,Edwin Khodabakchian,已经单独致力于Feedly这一"将twitter和Google Reader编织成杂志一般的体验"的项目好几年了.最近Edwin发布了一本关于构建基于JSON的Web服务最佳实践的cookbook.当然这还在进行当中,但现有提供的指南包括了: 第一阶段-定义一个简单的资源/服务

《大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一1.9 示例应用:SuperWebAnalytics.com

本节书摘来自华章出版社<大数据系统构建:可扩展实时数据系统构建原理与最佳实践>一书中的第1章,第1.9节,南森·马茨(Nathan Marz) [美] 詹姆斯·沃伦(JamesWarren) 著 马延辉 向 磊 魏东琦 译,更多章节内容可以访问"华章计算机"公众号查看. 1.9 示例应用:SuperWebAnalytics.com 在本书中,我们将创建一个大数据应用程序示例来说明一些概念.我们将为Google Analytics构建数据管理层-比如服务.该服务将能够每天追踪

大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一3.2 Apache Thrift

本节书摘来自华章出版社<大数据系统构建:可扩展实时数据系统构建原理与最佳实践>一书中的第3章,第3.2节,南森·马茨(Nathan Marz) [美] 詹姆斯·沃伦(JamesWarren) 著 马延辉 向 磊 魏东琦 译,更多章节内容可以访问"华章计算机"公众号查看. 3.2 Apache Thrift Apache Thrift(http://thrift.apache.org/)是一个可以用来定义静态类型化的.可实施模式的工具.它提供了接口定义语言,以通用数据类型的术

分布式服务化系统一致性的“最佳实干”

李艳鹏 易宝支付平台架构师,专注线上和线下支付平台的应用架构和技术架构的规划与落地,负责交易.支付.渠道.账务.计费.风控.对账等系统的设计与实现,在移动支付.聚合支付.合规账户.扫码支付.标记化支付等业务场景上有产品应用架构规划的经验. 1 背景 一致性是一个抽象的.具有多重含义的计算机术语,在不同应用场景下,有不同的定义和含义.在传统的IT时代,一致性通常指强一致性,强一致性通常体现在你中有我.我中有你.浑然一体:而在互联网时代,一致性的含义远远超出了它原有的含义,在我们讨论互联网时代的一致

学习笔记TF061:分布式TensorFlow,分布式原理、最佳实践

分布式TensorFlow由高性能gRPC库底层技术支持.Martin Abadi.Ashish Agarwal.Paul Barham论文<TensorFlow:Large-Scale Machine Learning on Heterogeneous Distributed Systems>. 分布式原理.分布式集群 由多个服务器进程.客户端进程组成.部署方式,单机多卡.分布式(多机多卡).多机多卡TensorFlow分布式. 单机多卡,单台服务器多块GPU.训练过程:在单机单GPU训练,

打造立体化监控体系的最佳实践——分布式调用跟踪和监控实践

摘要: 本文将从分布式系统调用的复杂现状说起,具体分析调用链的三大使用场景,以及调用链的最佳实践,简述如何将调用链作为排查问题的核心,通过其可以将各类数据关联在一起,提高问题排查能力. [最新快讯]EDAS上线方法追踪新特性,打通应用诊断的"最后一公里". 1. 分布式调用系统的现状 当前,随着互联网架构的扩张,分布式系统变得日趋复杂,越来越多的组件开始走向分布式化,如微服务.消息收发.分布式数据库.分布式缓存.分布式对象存储.跨域调用,这些组件共同构成了繁杂的分布式网络. 如上图右侧

CSS架构最佳实践:预测、重用、扩展、维护

对于想踏入前端开发的工程师来说,通晓CSS(Cascading Style Sheets)则是最基本的要求.而擅长CSS的Web开发人员不仅可以从视觉上复制实物原型,还可以用代码进行完美的呈现.无需使用表格.尽可能少的使用图片.如果你是个名副其实的高手,你可以快速把最新和最伟大的技术应用到你的项目中,比如媒体查询.过渡.滤镜.转换等.虽然这些都是一个真正的CSS高手所具备的,但CSS很少被人单独拿出来讨论,或者用它去评估某个人的技能. 有趣的是,我们很少这样去评价其他语言.Rails开发人员并不

基于Dubbo框架构建分布式服务

Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配置就能够实现分布式服务调用,也就是说服务提供方(Provider)发布的服务可以天然就是集群服务,比如,在实时性要求很高的应用场景下,可能希望来自消费方(Consumer)的调用响应时间最短,只需要选择Dubbo的Forking Cluster模式配置,就可以对一个调用请求并行发送到多台对等的提供方