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

相关文章

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启