Go微服務: 分布式之通過本地消息實現最終一致性

概述

  • 我們的業務場景是可以允許我們一段時間有不一致的消息的狀態的,并沒有說必須特別高的這個消息的一致性
  • 比如說在TCC這個架構中,如果采用了消息的最終一致性,整體架構設計要輕松好多
  • 即便我們庫存服務掛了,或者我們積分服務掛了也沒有關系,只要我們有中間的這個消息,那就是沒有問題的
  • 因為你在消息消費中,如果你你沒有消費成功,那么消息就會一直存在在這個消息隊列里

場景

  • 看看這個我們的這個具體的案例的場景是什么樣的?還是以這個訂單服務和庫存服務,還有積分服務為例
  • 比如說,現在要下個訂單,直接就在訂單服務里,把它搞定了,我們就正常下訂單
  • 建立我們的訂單表和我們的訂單產品表,然后,這時候發送一條消息到這個消息隊列里
  • 那么我們說這個如果我們發送失敗了,我們本地這個訂單服務也能感知到,它就進行回滾就可以了
  • 但是我們說突然的這個停電,這個我們就沒辦法感知到了
  • 另一種情況,說你發送這個成功了,比如說我們建這個訂單單服務,然后訂單生成了訂單產品表,也生成了, 消息發送也成功了
  • 但是消息隊列給我回消息的時候,由于網絡的擁塞或者是抖動,這都很正常
  • 然后,我們這個訂單服務,肯定是要有超時機制的,它就超時了,訂單就要回滾
  • 但是這個這個消息隊列是消息,可是真的到消息隊列里存在了
  • 那我下游的就庫存,還有積分服務就拿著這個消息去做自己的業務了,該扣減庫存就扣減庫存,該增加積分就增加積分
  • 但是,這個時候訂單已經回滾了,那老板或者業務就會問了,這訂單都沒有了,你這個庫存的積分增加是個什么意思
  • 那我們要怎么解決這個問題呢?
  • 那我們就是在我們這個訂單服務增加訂單的時候,我們不先去給他發這個消息
  • 我們是先在本地表里頭建立一個消息發送這個各種情況的一張表
  • 比如說, 我這個訂單服務,我建立了一條消息,但是這個消息沒有返回來
  • 有沒有返回來也沒有關系,這個表里已經記錄了,說可以定一種狀態,說就是未發送成功
  • 我們這里這個本地消息表,就以發送成功的這個狀態為準
  • 只要是你能記錄到這個表里的,沒有發送成功的,我們就把它這個狀態記錄上
  • 我們下次啟動的時候,在這個訂單服務里增加一個循環的這種定時任務
  • 我們一般是做成異步的,因為你要是同步的話,相當于本地的這個數據庫也是也有造成一定的壓力的
  • 我們就掃描這個之前沒有發送成功的這個消息,那就是說直到我們這個定時任務,一直發送這個消息隊列發送成功為止
  • 所以他一定是能達到最終一致性的,我們這個里面就有一個問題,說你沒發送成功,我記錄一條可以沒問題
  • 那我下次一發送這個消息隊列就成功了, 我回寫消息本地這個表就記錄了這條消息成功
  • 如果,遇到我們的這個庫存服務了,或者積分服務掛了都沒有問題
  • 因為你不消費消息隊列里的這個消息,你就不會確認,你不會確認的這個消息就永遠在消息隊列里,這個就沒有問題
  • 但是還有一種情況,比如我這個消息,可能發很多次都有問題,可能是消息隊列問題或者網絡等問題
  • 這樣,重復發送就帶來一個風險,比如下游如果重復消費怎么辦?這個就是我們下游服務要解決的問題
  • 本地消息的最終一致性,比TCC要簡單很多,但是在某些高并發的場景,它也是有自己的問題的
  • 如果一切正常,就發送,讓消息隊列讓消費者去消費就可以了
  • 如果有問題,就建立一張本地的這個消息發送表,記錄各種情況,它最后能保證我們消息的最終一致性,但是要解決重復消費消息的這種情況

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24274.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24274.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24274.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【2024PythonPycharm詳細安裝教程】

1.打開官網 https://www.python.org/ downloads——>Windows 2.找到 Download Windows installer (64-bit) 下載 3.下載完成雙擊安裝包 勾選Add python.exe to PATH(自動配置系統變量) 點擊Install Now(默認安裝) 然后看到安裝成功&#xff0…

LeetCode-day05-3038. 相同分數的最大操作數目 I

LeetCode-day05-3038. 相同分數的最大操作數目 I 題目描述示例示例1:示例2: 思路代碼 題目描述 給你一個整數數組 nums ,如果 nums 至少 包含 2 個元素,你可以執行以下操作: 選擇 nums 中的前兩個元素并將它們刪除。…

深度學習中2D檢測

深度學習中的2D目標檢測 2D目標檢測是深度學習中的一個關鍵任務,旨在識別圖像中的目標對象,并在每個目標對象周圍生成一個邊界框。該任務在自動駕駛、視頻監控、機器人視覺等領域具有廣泛應用。以下是對深度學習中2D目標檢測的詳細介紹,包括…

通過windbg查看dump文件中靜態變量的值

可以使用 WinDbg 和 SOS 擴展來查看它們。下面是如何使用 WinDbg 和 SOS 的步驟: 打開 WinDbg,并用它打開你的 dump 文件。你可以使用 File → Open Crash Dump 來實現。 在命令行中,加載 SOS 擴展。一般來說這可以通過 .loadby sos clr 來完…

Oracle EBS AP發票創建會計科目錯誤:子分類帳日記帳分錄未按輸入幣種進行平衡

系統版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 問題癥狀: 提交“創建會計科目”請求提示錯誤信息如下: 中文報錯: 該子分類帳日記帳分錄未按輸入幣種進行平衡。請檢查日記帳分錄行中輸入的金額。 英文報錯:The subledger journal entry does not balance i…

excel vlookup

Excel中的VLOOKUP函數用于在數據表中查找特定值,并返回該值所在行的另一個單元格中的值。這個函數非常有用,特別是在需要從一張表中查找信息并將其填充到另一張表中的情況下。VLOOKUP函數的基本語法是:VLOOKUP(查找值, 數據范圍, 返回值的…

PS的stable diffusion插件安裝指南

PS的stable diffusion插件安裝指南 1.首先要安裝stable diffusion,具體安裝方法,參考https://blog.csdn.net/sheji888/article/details/139196688 stable diffusion要求要啟用API功能 2.安裝ps2023以上版本,低于這個版本不能使用stable diff…

17- Redis 中的 quicklist 數據結構

在 Redis 3.0 之前,List 對象的底層數據結構是雙向鏈表或者壓縮列表,然后在 Redis 3.2 的時候,List 對象的底層改由 quicklist 數據結構實現。 其實 quicklist 就是【雙向鏈表 壓縮列表】組合,因為一個 quicklist 就是一個鏈表&…

什么是ESG?

什么是ESG? ESG的實施和發展是企業應對全球和國內環境、社會和治理挑戰的關鍵路徑。《ESG入門一本通》詳細闡述了ESG的概念、發展歷程和評價體系,并結合中國的實際情況,強調了ESG的重要性和必要性。企業需重視ESG管理和信息披露,…

詳細分析Mysql中的JSON_OBJECT() 基本知識(附Demo)

目錄 前言1. 基本知識2. Demo 前言 對于基本的命令行以及優化推薦閱讀: 數據庫中增刪改常用語法語句(全)Mysql優化高級篇(全)命令行登錄Mysql的詳細講解 1. 基本知識 JSON_OBJECT() 是 MySQL 中用于生成 JSON 對象…

信息系統項目管理師0149:輸入(9項目范圍管理—9.4收集需求—9.4.1輸入)

點擊查看專欄目錄 文章目錄 9.4 收集需求9.4.1 輸入9.4 收集需求 收集需求是為實現目標而確定,記錄并管理干系人的需要和需求的過程。本過程的主要作用是為定義產品范圍和項目范圍奠定基礎。本過程僅開展一次或僅在項目的預定義點開展。收集需求過程的數據流向如圖 9-2 所示。…

「前端+鴻蒙」鴻蒙應用開發簡介

鴻蒙應用開發是指使用華為鴻蒙操作系統(HarmonyOS)提供的API和開發工具,創建可以在鴻蒙設備上運行的應用程序。鴻蒙系統是華為開發的全場景、分布式操作系統,它支持多種設備類型,包括智能手機、平板電腦、智能電視、智…

Spring (45)Gateway

在計算機網絡中,一個網關(Gateway)是一個網絡節點,它充當不同網絡協議、應用程序或數據格式之間的轉換點。在微服務架構中,API網關(API Gateway)扮演著非常關鍵的角色,它是微服務和外…

電腦開機出現英文字母,如何解決這個常見問題?

電腦開機時出現英文字母的情況通常意味著系統在啟動過程中遇到了問題。這些英文字母可能是錯誤信息、系統提示或BIOS設置問題。通過理解這些信息并采取適當的措施,您可以解決大多數啟動問題。本文將介紹三種解決電腦開機出現英文字母問題的方法,幫助您恢…

智能合約中未授權訪問

未授權訪問: 如果智能合約對關鍵函數的訪問控制不足,攻擊者可能執行不應允許的操作,如修改合約狀態或提取資金。 未授權訪問示例 假設我們有一個智能合約,用于管理用戶的存款和提款。在這個例子中,合約沒有正確地限…

python使用appium打開程序后,為什么沒有操作后程序就自動退出了

當使用Appium打開應用程序并在沒有執行任何操作后它自動退出,這可能是由于幾個不同的原因。以下是一些可能的原因和相應的解決方案: 應用程序的默認行為: 有些應用程序在啟動后如果沒有用戶交互,可能會因為超時或其他邏輯而自動關…

BGP匯總+認證

一、BGP 的宣告問題 1、在 BGP 協議中每臺運行 BGP 的設備上,宣告本地直連路由 2、在 BGP 協議中運行 BGP 協議的設備來宣告.通過 IGP 學習到的,未運行 BGP 協議設備產2、生的路由; 在 BGP 協議中宣告本地路由表中路由條目時,將攜帶本地到達這…

Spring Boot集成geodesy實現距離計算

1.什么是geodesy? 浩瀚的宇宙中,地球是我們賴以生存的家園。自古以來,人類一直對星球上的位置和彼此的距離著迷。無論是航海探險、貿易往來還是科學研究,精確計算兩個地點之間的距離都是至關重要的。 Geodesy:大地測量…

Qt實現麥克風音頻輸入保存wav文件

一.本文目的 實現在Qt中接收麥克風數據并保存為WAV文件,使用QAudioInput來錄音,并使用QFile來保存數據到WAV文件。 開發環境:QT5.12 本文用極簡代碼實現,核心代碼只需不到100行。 完整工程代碼文末鏈接可以直接下載。 二.代碼實…

51單片機STC89C52RC——創建Keil項目

一,打開Keil5 菜單---project--New uVision Project... 二,新建項目文件夾 彈出選擇文件夾對話框后,可以右鍵新建一個項目文件夾【文件夾名字可以隨便取,自己看得懂就行,建議不要有特殊字符】,這樣該項目…