Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >大道至简-Shopify 构建弹性支付系统的 10 条原则

大道至简-Shopify 构建弹性支付系统的 10 条原则

作者头像
JavaEdge
发布于 2023-11-30 01:30:49
发布于 2023-11-30 01:30:49
16300
代码可运行
举报
文章被收录于专栏:JavaEdgeJavaEdge
运行总次数:0
代码可运行

0 大纲

  1. Lower the Timeouts, and Let the Service Fail Early
  2. Add Circuit Breakers
  3. Capacity Planning
  4. Add monitoring and alerting
  5. Implement Structured Logging
  6. Use Idempotency Keys
  7. Be Consistent with Reconciliation
  8. Incorporate Load Testing
  9. Get on top of incident management
  10. Organize Incident Retrospectives

1 降低超时时间,让服务尽早失败

默认超时时间为 60 秒。根据 Shopify 的经验,5 秒的读取超时时间和 1 秒的写入超时时间是不错的设置。

超时时间也可以在数据存储中设置。例如,MySQL 有 MAX_EXECUTION_TIME 优化提示,用于以毫秒为单位设置每个 SELECT 查询的超时时间。

Go 中的 http.Client 和 Node.JS 中的 http.request 等其他编程语言中的 HTTP 客户端根本没有默认超时时间!这意味着一个无响应的服务器可能会无限期地占用您的资源,并不必要地增加基础架构费用。

2 添加断路器

Shopify 开发了 Semian 来使用 Ruby 中的断路器来保护 Net::HTTP、MySQL、Redis 和 gRPC 服务。

通过在检测到服务已关闭时立即引发异常,他们通过不等待预期会发生的另一次超时来节省资源。

就像在家中或公寓中会发现的断路器一样,一旦断路器打开或触发,就没有什么可以通过。

3 容量规划

如果我们的队列中有 50 个请求到达,处理一个请求平均需要 100 ms,那吞吐量是每秒 500 个请求。

N+1 查询会增加请求的延迟并降低吞吐量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
capacity = throughput x latency

4 添加监控和告警

谷歌的站点可靠性工程(SRE)书中列出了一个面向用户的系统应该监控的四个黄金信号: 延迟、流量、错误和饱和度。

5 实现结构化日志记录

将日志存储在集中地方,并使它们易于搜索。

指标提供了系统行为的高级概述,而日志记录允许我们了解单个 Web 请求或后台作业内部发生的事情。

在分布式系统中,传递某种关联标识符很有用。一个假设的例子是当买家在结账时启动支付,关联_id 由我们的 Rails 控制器生成。

6 使用幂等键

确保支付或退款只发生一次,尽管偶尔会出现小故障。

请改用通用唯一词汇排序标识符 (ULID) 作为这些幂等键,而不是随机版本 4 UUID。

在 Shopify 的规模下,每一百万次不可靠的支付处理机会意味着它每天发生很多次。如果这是超时的支付 API 调用,他们希望重试请求,但要安全地进行重试。

7 与调节保持一致

数据库中存储与 Shopify 的金融合作伙伴的调节中断。

通过调节,他们确保自己的记录与金融合作伙伴的记录一致。他们调节单个记录,如费用或退款,以及尚未支付给商户的当前余额等汇总记录。

8 结合负载测试

如果传入工作的数量足够大,他们的服务器甚至会耗尽内存来存储队列上的工作并崩溃。

Shopify 定期模拟大量抢购活动以获得基准测试结果。

9 掌握事件管理

事件通常从值班服务所有者收到页面开始,这可能是基于监视的自动警报,也可能是如果有人注意到问题,他们会手动发送。

每个事件通道都有 3 个角色:值班事件管理器(IMOC)、支持响应管理器(SRM)和服务所有者。

10 复盘

对于每个事件,Shopify 会提出 3 个问题:确切发生了什么?他们对系统有什么错误的假设?他们可以做些什么来防止这种情况发生?

一旦了解了这些,通常会分配几个行动项来实施保护措施,以防止同样的事情再次发生。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
故障驱动的微服务架构设计
此文背景: 之所以发布此文,是有一个直接的原因,就是我们之前在线上遇到了一个使用timeout来判断是否失败的案例,这是真实的,结果就是效果很不好。看了本文中介绍的各种技术和架构模式,让我忽然对之前的这个案例有了一个新的认识,就是“快速失败”不应该依赖于传统的比如timeout这种超时机制来进行,也许使用本文中介绍到的技术(比如:Circuit Breakers)要更加地可靠和受控。 目录 微服务架构的风险 优雅的服务降级 变更管理 健康检查和负载平衡 自愈(Self-healing) 故障转移缓存
ImportSource
2018/04/03
1.3K0
故障驱动的微服务架构设计
微服务架构如何避免大规模故障?
微服务架构通过一种良好的服务边界划分,能够有效地进行故障隔离。但就像其他分布式系统一样,在网络、硬件或者应用级别上容易出现问题的机率会更高。服务的依赖关系,导致在任何组件暂时不可用的情况下,就它们的消费者而言都是可以接受的。为了能够降低部分服务中断所带来的影响,我们需要构建一个容错服务,来优雅地应对特定类型的服务中断。
lyb-geek
2021/12/10
4360
微服务架构如何避免大规模故障?
使用服务网格和 Envoy Gateway 构建客户端的可用性和弹性
在讨论可用性和弹性时,我们通常是从基础设施和服务的角度来探讨的。我们很少考虑是否可以在客户端采用某种方法来提高后端服务的“实际感知可用性”(即在客户端测量到的服务的可用性)。这主要是因为我们在大部分情况下都无法控制客户端与服务的交互方式。但实际上我们有办法对客户端和服务之间的交互进行控制,从而提高客户端对服务的“实际感知可用性”。
赵化冰
2024/04/08
2040
Dapr 弹性的策略
云原生应用需要处理 云中很容易出现瞬时故障。原因在以下文档 暂时性故障处理[1] 中有具体说明。
张善友
2022/03/29
9240
Dapr 弹性的策略
分布式系统的弹性设计
在讨论分布式系统的弹性之前,让我们快速回顾一些基本术语: 弹性Resiliency:任何系统从困难中恢复的能力,(banq注:弹性也就是适应能力)。 分布式系统:一些网络组件通过传递消息来完成一个共同目标。 可用性:任何系统在任何时间点保持正常运行的可能性。 故障与故障:故障Fault是您的系统中是不正确的内部状态。系统中一些常见的故障例子包括: 1.存储层缓慢 2.应用程序中的内存泄露 3.被阻塞的线程 4.依赖性故障 5.在系统中传播坏数据(通常是因为输入数据没有足够的验证) 失败Failure是系统无法执行其预期工作。 失败意味着系统正常运行时间和可用性的损失。故障如果不被封装,会导致在系统中传播,从而导致失败。 当故障Fault转为失败Failure时就意味着系统发生了故障: 弹性就是为了防止故障Fault转化为失败Failure 我们为什么关心系统的弹性? 系统的弹性与其正常运行时间和可用性成正比。系统越有弹性,服务用户的可用性越高。 如果不具有弹性能力,可能会以多种方式影响公司各个方面。 分布式系统的弹性设计很难 我们都明白'可用'至关重要。为了保证可用性,我们需要从零开始建立弹性,以便我们系统中的故障自动恢复。 但是在具有多个分布式系统的复杂微服务架构中建立弹性是很困难的。这些困难是: 1.网络不可靠 2.依赖性总是失败 3.用户行为是不可预测的 虽然构建弹性很难,但并非不可能。遵循一些构建分布式系统的模式可以帮助我们在整个服务中实现较高的正常运行时间。我们将讨论未来的一些模式: 模式[0] = nocode
lyb-geek
2018/09/27
2K0
分布式系统的弹性设计
微服务架构下请求调用失败了怎么办!
微服务架构相比单体架构,服务的调用从同一台机器内部的本地调用变成了不同机器之间的远程方法调用,但是这个过程也引入了两个不确定的因素:
JavaEdge
2021/02/23
1.1K0
微服务架构下请求调用失败了怎么办!
【软件架构】支持大规模系统的设计模式和原则
今天,即使是小型初创公司也可能不得不处理数 TB 的数据或构建支持每分钟(甚至一秒钟!)数十万个事件的服务。所谓“规模”,通常是指系统应在短时间内处理的大量请求/数据/事件。
架构师研究会
2022/05/05
6030
【软件架构】支持大规模系统的设计模式和原则
分布式系统架构4:容错设计模式
容错策略,指的是“面对故障,我们该做些什么”;而容错设计模式,指的是“要实现某种容错策略,我们该如何去做”。
卷福同学
2024/12/20
1710
微服务架构之容错Hystrix
假设单体应用可用率为99.99%,即使拆分后每个微服务的可用率还是保持在99.99%,总体的可用率还是下降的。因为凡是依赖都可能会失败,凡是资源都是有限制的,另外网络并不可靠,有可能一个很不起眼的微服务模块高延迟最后导致整体服务不可用
公众号_松华说
2019/07/16
6020
微服务架构之容错Hystrix
微服务架构开发实战:什么是微服务的熔断机制和熔断的意义
在2017年2月1日,GitLab公司的运维人员就出现过这样的事故。当时运维人员在进行数据库维护时,通过执行rm -rf命令,删除了约300GB生产环境数据。由于数据备份失效,导致整个网站宕机数十个小时。
愿天堂没有BUG
2022/10/28
1.2K0
微服务架构开发实战:什么是微服务的熔断机制和熔断的意义
微服务架构下请求调用失败的解决方案
相比单体架构,微服务架构下,服务调用从同一台机器内部的本地调用变成了不同机器间的远程方法调用,这就引入不确定因素:
JavaEdge
2022/11/30
9890
微服务架构下请求调用失败的解决方案
好技能 | 微服务调用失败时常用处理手段
文章名《Spring Cloud Alibaba + Dubbo 搭建一个微服务架构》 作者:王二蛋
穿过生命散发芬芳
2024/11/28
2190
10张图带你彻底搞懂限流、熔断、服务降级
在分布式系统中,如果某个服务节点发生故障或者网络发生异常,都有可能导致调用方被阻塞等待,如果超时时间设置很长,调用方资源很可能被耗尽。这又导致了调用方的上游系统发生资源耗尽的情况,最终导致系统雪崩。
Java识堂
2021/04/20
21.3K0
10张图带你彻底搞懂限流、熔断、服务降级
断路器模式
连接到远程服务或资源时处理故障,此类故障所需恢复时间不定。 这可以提高应用程序的稳定性和复原能力。
只喝牛奶的杀手
2019/09/02
1.4K0
断路器模式
Uber 下一代支付平台的系统架构设计
作为一个平台,Uber(优步)邀请用户利用它,从它身上赚钱,并因它而快乐。每天,Uber 的服务超过 1800 万次请求,使人们在谋生的同时能够自由行动、开阔思路。作为底层引擎之一,Uber Money 实现了人们参与 Uber 体验的一些最重要的方面。像这样的系统不仅应该是健壮的,而且还应该是高度可用的,对宕机采取零容忍的态度,因为我们的成功口号是“准时、准确和合规地收付款”。
guichen1013
2020/11/09
6340
Uber 下一代支付平台的系统架构设计
【韧性架构设计】软件韧性:从意外中恢复的 7 个必备因素
软件从意外事件中恢复的能力是软件弹性。这意味着软件工程师必须预测意外事件并对其进行解释。创建这种容错的解决方案可以在代码中或在基础设施层上。
架构师研究会
2022/09/26
1K0
云原生系统之弹性模式
1.云原生系统的弹性模式resiliency pattern 1.1 服务故障的雪崩效应 1.2 回应之前云原生--弹性请求的疑问?
有态度的马甲
2021/08/05
1.6K0
【韧性设计】韧性设计模式:重试、回退、超时、断路器
软件本身并不是目的:它支持您的业务流程并使客户满意。如果软件没有在生产中运行,它就无法产生价值。然而,生产性软件也必须是正确的、可靠的和可用的。
架构师研究会
2022/05/25
1.4K0
【韧性设计】韧性设计模式:重试、回退、超时、断路器
大话微服务架构的故障隔离及容错处理机制
8、限流器和负载开关(Rate Limiters and Load Shedders)
技术zhai
2018/08/27
2.5K0
大话微服务架构的故障隔离及容错处理机制
【分布式系统设计】:漫谈幂等
因为笔者对分布式系统有着狂热的兴趣,因此开了【分布式系统设计】这一专题,不仅可以分享学习成果,帮助大家面试,根据费曼方法,还能在写文章的过程过发现自己认识的不足。
TechFlow-承志
2020/03/05
6000
【分布式系统设计】:漫谈幂等
相关推荐
故障驱动的微服务架构设计
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验