大道至簡-Shopify 構建彈性支付系統的 10 條原則

来源:https://www.cnblogs.com/JavaEdge/archive/2023/11/29/17864591.html
-Advertisement-
Play Games

0 大綱 Lower the Timeouts, and Let the Service Fail Early Add Circuit Breakers Capacity Planning Add monitoring and alerting Implement Structured Loggin ...


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 查詢會增加請求的延遲並降低吞吐量。

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 個問題:確切發生了什麼?他們對系統有什麼錯誤的假設?他們可以做些什麼來防止這種情況發生?

一旦瞭解了這些,通常會分配幾個行動項來實施保護措施,以防止同樣的事情再次發生。

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • and dest,src將目標與源做與操作 or dest,src將目標與源做或操作 add 加得數的值超出範圍即會溢出 inc 彙編語言中的自增指令,相當於++ div指令 不會給出被除數 切記提前在預設的寄存器中設置好被除數,且預設寄存器不做別的用處 dup設置記憶體空間,與db、dw、dd等數據 ...
  • 概述 - Overview 在我初學 C++ 時,static、inline、extern 可能是最令我迷惑的 C++ 說明符,原因是它們在不同的語境下會發揮不同的作用,而且某些說明符的含義已經和以前不同,這加劇了我在查詢資料時的困擾。所以今天決定好好總結一下。 首先要介紹 C++ 的兩個概念:存儲 ...
  • 哈嘍大家好,我是鹹魚 當我們在學習 Python 的時候,可能會經常遇到單下劃線 _ 和雙下劃線 __ 這兩種命名方式 單下劃線 _ 和雙下劃線 __ 不僅僅是只是一種簡單的命名習慣,它們在 Python 中有著特殊的含義,對於代碼的可讀性和功能實現有著關鍵的作用。 那麼今天我們來看一看在 Pyth ...
  • LinkedList是Java中的一個雙向鏈表。它實現了List和Deque介面,在使用時可以像List一樣使用元素索引,也可以像Deque一樣使用隊列操作。LinkedList每個節點都包含了前一個和後一個節點的引用,因此可以很方便地在其中進行節點的插入、刪除和移動。相比於ArrayList,Li... ...
  • gRPC(gRPC Remote Procedure Call)是由 Google 開發的開源 RPC 框架,它基於 HTTP/2 標準,使用 Protocol Buffers 作為介面定義語言(IDL)。gRPC 提供了一種高效、跨語言、跨平臺的遠程過程調用(RPC)解決方案,被廣泛應用於構建分佈 ...
  • Zlib是一個開源的數據壓縮庫,提供了一種通用的數據壓縮和解壓縮演算法。它最初由Jean-Loup Gailly和Mark Adler開發,旨在成為一個高效、輕量級的壓縮庫,其被廣泛應用於許多領域,包括網路通信、文件壓縮、資料庫系統等。其壓縮演算法是基於DEFLATE演算法,這是一種無損數據壓縮演算法,通常... ...
  • 大家好,我是棧長。 沒錯,就在昨天,Spring Boot 2.x 停止維護了。。 Spring Boot 最後一個 2.x 的版本 2.7.x 已經停止維護,3.0.x 也停止維護了,商業支持的版本也只有 2.6.x 了,2.5.x 以下的版本徹底退出歷史舞臺。。 從路線圖可以看到每個版本的終止時 ...
  • 目前倉儲中台和京喜BP的合作主要通過SPI擴展點的方式。好處就是對修改封閉、對擴展開放,中台不需要關心BP的業務實現細節,通過對不同BP配置擴展點的介面來達到個性化的目的。目前京喜BP主要提供兩種方式的介面實現,一種是jar包的方式,一種是提供jsf介面。 下邊來分別介紹下兩種方式的定義和實現。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...