分布式系統如何做數據對賬?

前言

在分布式系統中,雖然我們會使用各種分布式事務的方案,來保證各個系統之間的一致性。但是,很多時候往往事與愿違。

尤其是現在很多公司都采用最終一致性的方案,而所謂最終一致性,無論是本地消息表、事務消息、還是任務重試,系統之間的調用都是有可能失敗的。

而一旦發生失敗,就需要有一套機制來發現這些不一致的問題,這時候就需要做數據對賬了

對賬時機

一般來說,根據對賬的時機分為兩種,離線對賬和(準)實時對賬。

實時對賬,一般來說基本都是準實時,也就是說并不能保證無延遲,但是一般可以控制在秒級別的延遲上。而離線對賬一般都是D+1的核對。

D+1:D指的是自然日,包括工作日和節假日。+1指的是第二天,也就是說數據發生后的第二天進行核對。

T+1:T指的是交易日,一般來說就是工作日,所以T+1指的就是數據發生后的下一個工作日進行核對。

技術實現

那么對賬的技術實現上一般主要就是兩種,要么是寫代碼核對,要么是寫SQL核對.

寫代碼就是查出需要比對的兩條記錄,然后進行字段的比對,不一致的就拋出來。

寫SQL就是做join查詢或者子查詢,然后通過where條件比較需要核對的字段,不一致的就拋出來。

寫代碼這種核對方式,一般來說都是通過定時任務實現的,通過運行定時任務,然后去掃表,或者去遠程拉數據然后在業務代碼中進行核對,這種方式的優點就是比較通用,不管是數據庫,還是文件,還是遠程接口,都可以做核對。缺點就是一旦數據量大了,代碼核對的時效性就會比較差,而且代碼運行存在失敗的可能。萬一數據量特別大,就可能會出現掃表掃不動,文件加載到內存導致OOM等問題。

所以,寫代碼的核對方式不推薦

那么,更好一點的方式就是寫SQL了,因為數據都在數據庫(數倉或者大數據框架)中,這些都可以通過SQL進行查詢,如下就是比較兩個系統中金額是否一致的SQL:

SELECT OUTbiz NO,bill NO,
OWNER 
FROMbill item 
WHEREOUT biz NO IN (AND charge ON amount - charge off amount = 0’ SELECTbiz id FROMcollectionCASEitem detail WHERECASEitem state = "COLLECTING" AND cur ovd principal >

那在哪寫這些SQL進行核對,就有很多種方案了,一般來說有以下幾個:

1、離線數倉,主要用于離線數據核對。我們現在每天會把需要離線存儲的數據同步到數倉中,然后在數倉中寫SQL進行數據的核對。

2、在線數據庫,離線核對的話發現問題比較慢,好一點的方案是在在線庫做核對,可以直接在數據庫中寫SQL進行數據核對。為了避免數據核對影響真實業務,可以考慮在備庫中執行SQL。但是有的時候數據核對可能是多個系統之間的,這時候就要做跨庫join,但是并不是所有的數據庫、所有的引都文持跨庫join的。

3、準實時數據庫,還有一種方案,那就是不直接在數據庫中寫SQL,而是把數據同步到其他的地方,比如通過監聽binlog的方式,把MYSQL的數據同步到實時數倉,比如我們公司內部用的就是AnalyticDB,把需要做核對的數據同步到ADB中,我們會盡量放到一個空間下面,然后在這里面寫SQL作核對。同步出來的這個ADB數據,不僅可以做核對,還可以用于查詢或者做報表,

4、ETL核對,還有一種比較常見的方案,那就是通過ETL工具進行數據核對,ETL包括了數據的提取、清洗、轉化及加工,所以在這個過程中也是可以做核對的。

5、flink核對,flink是一個非常牛X的流處理框架,可以通過fink進行數據核對。


核對與告警

有朋友提問:如果通過sql語句發現有不一致的數據,一般是怎么處理?是發告警通知開發人員還是說需要將有問題的數據標記出來過段時間重新核對?

我們一般來說,告警的話,人工一定要跟進

至于說過段時間重新核對,這種我們一般在報警規則中把他屏蔽掉了。有需要重新核對的,我們會做一些延遲核對,或者二次核對。或者直接報警規則設置成多次失敗后再報警,或者告警值調高一點

這樣就是職責單一,核對就是核對,報警就是報警。有報警人就要看,否則都是無效報警,那有效報警也沒人看了.

?

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

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

相關文章

藍橋杯:數組分割(Java)

目錄 問題描述輸入格式輸出格式代碼實現 問題描述 小藍有一個長度為N的數組A[A0,A1,… AN-1]。現在小藍想要從A對應的數組下標所構成的集合Ⅰ0,1,2,…,N -1中找出一個子集R1,那么R1在Ⅰ中的補集為R2。記S1∈∑Ar,S2∈∑Ar,我們要求S1和S2均為…

node 之 npm

1.什么是包 node.js中的第三方模塊又叫做包 就像電腦和計算機指的是相同的東西,第三方模塊和包指的是同一個概念,只不過叫法不同 2.包的來源 不同于 Node.js 中的內置模塊與自定義模塊,包是由第三方個人或團隊開發出來的,免費供所…

【計算機網絡——應用層】http協議

文章目錄 1. http協議1.1 http協議簡介1.2 url組成1.3 urlencode與urldecode 2. http協議的格式2.1 http協議的格式2.2 一些細節問題 3. http的方法、狀態碼和常見響應報頭3.1 http請求方法3.2 http狀態碼3.3 http常見的響應報頭屬性 4. 一個非常簡單的http協議服務端5. http長…

【X806開發板試用】文章一 ubuntu開發環境搭建

一、環境配置 官方鏈接: 環境配置 1.安裝必要的庫和軟件 sudo apt-get install build-essential gcc g make zlib* libffi-dev e2fsprogs pkg-config flex bison perl bc openssl libssl-dev libelf-dev libc6-dev-amd64 binutils binutils-dev libdwarf-dev u-b…

pix2pix-zero

pix2pix-zero:零樣本圖像到圖像轉換 論文介紹 Zero-shot Image-to-Image Translation 關注微信公眾號: DeepGoAI 項目地址:https://github.com/pix2pixzero/pix2pix-zero 論文地址:https://arxiv.org/abs/2302.03027 本文介紹了一種名為…

Golang 函數中 defer 和 return 的調用順序

先來看一段代碼: package mainimport "fmt"func f() (ret int) {defer func() {ret}()return 1 } func main() {fmt.Println(f()) }上面這段代碼的輸出是2,不是1 原因在于: 1)ret 是在執行 return 1 語句后發生的 2&…

基于SpringBoot多模塊項目引入其他模塊時@Autowired無法注入

基于SpringBoot多模塊項目引入其他模塊時Autowired無法注入 一、問題描述1、解決方案 一、問題描述 啟動Spring Boot項目時報 Could not autowire. No beans of ‘xxxxxxxx’ type found. 沒有找到bean的實例,即spring沒有實例化對象,也就無法根據配置文…

【LeetCode-中等】209.長度最小的子數組-雙指針/滑動窗口

力扣題目鏈接 1. 暴力解法 這道題的暴力解法是兩層嵌套for循環,第一層循環從 i 0 開始遍歷至數組末尾,第二層循環從 j i 開始遍歷至找到總和大于等于 target 的連續子數組,并將該連續子數組的長度與之前找到的子數組長度相比較&#xff0…

傳輸層兩大戰將TCP、UDP的定位

傳輸層 定義一些傳輸數據的協議和端口,傳輸協議同時進行流量控制,根據接收方的數據吞入熟讀,規定適當的發送速率,解決傳輸效率及能力問題 什么是TCP TCP/IP即傳輸控制/網絡協議,是面向連接的協議,發送數…

什么是IP公網?

IP公網是指互聯網上可以公開訪問的IP地址。它是經過互聯網服務提供商(ISP)向用戶提供的公共網絡IP地址。與之相對的是內網IP地址,內網IP地址一般是由路由器或交換機分配給連接在局域網中的設備使用。 IP公網的作用非常廣泛,可以應…

C#解析JSON

https://blog.csdn.net/weixin_43046974/article/details/131449900 C#解析JSON 1. JSON定義2. JSON一般構成及解析方法3. 解析舉例子 1. JSON對象解析,只包含一層對象{}2. 嵌套JSON對象解析,包含多層對象{}3. JSON數組解析1(數組循環遍歷&…

Web APIs知識點講解(階段二)

DOM-事件基礎 一.事件 1.事件 目標:能夠給 DOM元素添加事件監聽 事件:事件是在編程時系統內發生的動作或者發生的事情,比如用戶在網頁上單擊一個按鈕 事件監聽:就是讓程序檢測是否有事件產生,一旦有事件觸發,就立即調用一個函…

http工具類

public class HttpRequstUtil {/*** http請求方法** param message 查詢條件* param url 查詢地址* param token 身份驗證token* param socketTimeout socket 響應時間* param connectTimeout 超時時間* return 返回字符串*/Deprecatedpublic stat…

金仕達與 DolphinDB 建立深度合作,共筑 FICC 科技創新新篇章

從“關起門做交易”到“打開門做服務”,國內 FICC 業務正經歷從自營到市場化服務的轉變,借助數據分析、算法交易等技術的快速發展,交易團隊能夠更加主動地發現市場需求,為不同客群提供更好的做市業務,FICC 交易電子化已…

打造智能汽車微服務系統平臺:架構的設計與實現

隨著智能汽車技術的飛速發展,微服務架構在汽車行業中的應用越來越廣泛。采用微服務架構可以使汽車系統更加靈活、可擴展,并且有利于快速推出新功能和服務。本文將從設計原則、關鍵技術、數據安全等方面,介紹如何搭建智能汽車微服務系統平臺架…

網絡通信技術

?1.分組交換技術 在網絡通信中,數據通過網絡節點的某種轉發方式,實現從一個端系統到另一個端系統之間的數據傳輸技術稱為數據交換技術。數據交換技術有電路交換、報文交換和分組交換,計算機網絡采用分組交換技術。 分組就是源主機(如服務器…

【Python】FastAPI 項目創建 與 Docker 部署

文章目錄 前言&需求描述1. 本地FastAPI1.1 Python 環境準備1.2 本地 Pycharm 創建FastAPI項目 2. Python FastAPI 部署2.1 服務器配置Python環境2.2.1 下載與配置Git、Pyenv等工具2.2.2 下載與配置Python 2.2 FastAPI 打包成鏡像2.2.1 項目準備所需環境文件2.2.2 編寫Docke…

畢業設計——基于springboot的聊天系統設計與實現(服務端 + 客戶端 + web端)

整個工程包含三個部分: 1、聊天服務器 聊天服務器的職責一句話解釋:負責接收所有用戶發送的消息,并將消息轉發給目標用戶。 聊天服務器沒有任何界面,但是卻是IM中最重要的角色,為表達敬意,必須要給它放個…

入侵和攻擊模擬 (BAS) 技術應用實踐

文章目錄 前言一、實施BAS的必要性二、實施BAS的關鍵步驟1、識別網絡中的脆弱區域2、創建基線安全模型3、選擇合適的BAS工具4、進行模擬攻擊測試5、分析結果并改進三、BAS實施中的挑戰1、組織的專業知識和能力有限2、改變傳統工作流程3、安全預算不足4、難以與現有安全基礎設施…

C語言中的不同變量初始值:深度解析與實踐指南

在C語言編程領域,理解和掌握變量的初始化原理和過程是構建穩健、高效代碼的基礎。C語言對不同類型變量的初始化處理方式存在差異,這要求開發者明確理解并合理應用這些規則以避免潛在的運行時錯誤和未定義行為。本文將詳細解讀C語言中各類變量的初始狀態設…