ButterCMS架构:完成数百万次调用的关键任务API

2024-03-27 00:08

本文主要是介绍ButterCMS架构:完成数百万次调用的关键任务API,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文:ButterCMS Architecture: A Mission-Critical API Serving Millions Of Requests Per Month 
作者:
Jake Lumetta 
译者:夜风轻扬

还在为网站中断而烦恼么?还在为可能存在的单点故障而终日提心吊胆么?ButterCMS也许给你带来新的选择,请见下文:

ButterCMS 允许开发者在几分钟内将内容管理系统添加到任何网站。我们的业务要求我们的API能够100%处于正常工作状态,但在经历了多次几乎使业务陷入瘫痪的中断之后,我们开始关注于消除单点故障。在这篇文章中,我将讨论如何使用Fastly先进云平台和其他策略,以确保我们客户网站能够正常运行。

在其核心,ButterCMS提供:

  • 一个内容编辑者的仪表盘

  • 一个用于获取内容的JSON API

  • 将ButterCMS集成到本地代码中的SDK

ButterCMS 技术栈

ButterCMS是一个单一的Django应用,其负责营销网站、编辑工具、API和为客户提供支持的后台工具。Django应用在配备一个Postgres数据库的Heroku上运行。

我们还利用以下的第三方服务:

  • Filestack 为客户提供图像编辑;

  • Fastly 用于外部 API缓存和交付;

  • Cloudfront 作为客户资产的CDN;

  • 用于DNS的EasyDNS。

停机时间是致命的

客户的web站点在发送request/response过程中,会产生对ButterCMS的API调用来获取页面内容。对ButterCMS的API请求失败,他们的页面可能不会呈现。如果API宕机了,我们客户的网站就会和我们一起停机。

这是我们在早期学到的严重一课。不可靠的服务器托管导致频繁的间歇性中断和性能下降,这会使客户很失望。一次搞砸的DNS迁移导致了几个小时的API宕机,而这又使几十个客户的网站停机几乎半日,并让大量的客户对是否还能依赖我们产生疑问(少数的客户已经离我们而去)。

在这次事故以后,我们明白,确保客户近乎100%的运行率是个现实问题。未来某个重大的中断可能会让我们失去客户并使我们的事业陷入危机。

提交一个全球的,快速的,有弹性的API

完全避免故障是不可能的-只能尽最大努力减少发生的机会。 
例如,通过运行自己的物理服务器来“控制自己的命运”,虽然可以保护你不受主机提供商停机的影响,但是要不得不处理安全性和伸缩性问题,这两者可以轻易造成停机,并且难以恢复。

对于我们的团队来说,始终保持API可用并确保它在全球范围内的高性能是至关重要的。但作为一个小公司,并不具有足够的资源来提供高可扩展性能并保持近乎100%可用的API。所以我们使用了可以满足需求的Fastly

我们将Fastly置于API的前端,作为一个缓存层以确保所有的API请求都通过它们的CDN来提供服务。

当客户更新网站内容时,所编辑的特定内容块API键失效。无缓冲请求发送到服务器,但是由于客户网站的内容更新,相对于它们访问者的数量的并不频繁,仍然有94%的击中率。这意味着即使数据库或服务器经历了间歇性的中断,我们的API仍然可用。我们不希望这样,但理论上,服务器可以完全关闭几个小时,而客户的网站会像Fastly一样长时间保持在线。 
Fastly的全球CDN提供了另一个好处。许多客户都有静态的JavaScript站点,其API请求是来自访问者的浏览器而不是他们的服务器。通过Fastly的CDN来提供API响应,这意味着客户网站的访客,无论在何处都可以获得快速的加载次数。

消除单点故障

在ButterCMS的早期,处理两个独立的DNS事件令人身心疲惫。在第一个事件中,由于DNS服务商把我们账户意外“删除”,而导致一个中断事件,该事件经过了近6个小时才完全恢复。第二个事件是一次常规的DNS编辑,引起(不同)DNS提供商发生了故障,这个问题花费了近1天时间才解决。DNS事件特别有破坏性,因为即使发现并修复了问题,还需要等待不同DNS服务器和ISP去清除他们的缓存,直到系统能正常访问(DNS服务器忽视你的TTL设置,只使用他们自己的策略)。

经验告诉我们在整个架构中注意消除任何一个单点故障。

对于DNS服务器,使用来自不同DNS提供商的不同域名服务器。DNS提供商常常允许并鼓励使用4-6台冗余域名服务器(如ns1.example.com, ns2.example.com)。这很好:如果一台宕机了,其他主机依然能够提供服务。但是,如果域名服务器来自于同一家公司,就只能祈祷他们保持100%的可靠。

对于应用服务器,则使用Heroku的监视和自动扩展工具,来确保流量性能不会从峰值上降低(如果 Fastly停机了,需要将所有的请求都直接路由到服务器)。除了通过 Fastly缓存API,也使用Memcached在应用层缓存API。这为防止数据库或者服务器中断提供了一个额外缓存。

通过在谷歌云上运行一个服务器和数据库实例作为快速失效备援,来防止极小可能出现的Heroku或者AWS(Heroku运行其上)中断。

故障难以避免

无论API是多么的可靠,也不得不面临网络不可靠的现实,故障是难以避免的。可能都遇到过连接WI-FI,或者是电话掉线的问题。总的来说,中断、路由问题和其他断续故障在统计学意义上是不常见的,但是,仍然有可能在一定的环境背景下发生。

为了消除这种固有的不可靠环境,需要帮助客户开发在失效情况下的容错应用。SDK可以提供一些特性,诸如在API请求失效时自动重试,或者为用户提供类似Redis的故障迁移缓存。

结论

在无意识中,很多人把单点故障引入到堆栈中。ButterCMS的成功,在于确保客户应用不会停机。要实现这一目标,既要尽可能多消除来自基础设施的单点故障,还要提供SDK帮助客户在应用中实现弹性和容错。

这篇关于ButterCMS架构:完成数百万次调用的关键任务API的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/850312

相关文章

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

如何更优雅地对接第三方API

如何更优雅地对接第三方API 本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程中,有不少场景会对接第三方的API,例如第三方账号登录,第三方服务等等。第三方服务会提供API或者SDK,我依稀记得早些年Maven还没那么广泛使用,通常要对接第三方

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

创业者该如何设计公司的股权架构

本文来自七八点联合IT橘子和车库咖啡的一系列关于设计公司股权结构的讲座。 主讲人何德文: 在公司发展的不同阶段,创业者都会面临公司股权架构设计问题: 1.合伙人合伙创业第一天,就会面临股权架构设计问题(合伙人股权设计); 2.公司早期要引入天使资金,会面临股权架构设计问题(天使融资); 3.公司有三五十号人,要激励中层管理与重要技术人员和公司长期走下去,会面临股权架构设计问题(员工股权激