分散式事務不理解?一次給你講清楚!

来源:https://www.cnblogs.com/javastack/archive/2020/06/28/13205566.html
-Advertisement-
Play Games

作者:鄭鄭好victorzheng juejin.im/post/5baa54e1f265da0ac2566fb2 文章綱要 此次分享的緣由 目前分散式事務問題是怎麼解決的 行業中有什麼解決方案 這些解決方案分別有什麼優缺點 別人是怎麼做的 我們可以怎麼來做 此次分享的緣由 支付重構 考慮支付重構的 ...


作者:鄭鄭好victorzheng
juejin.im/post/5baa54e1f265da0ac2566fb2

文章綱要

  1. 此次分享的緣由

  2. 目前分散式事務問題是怎麼解決的

  3. 行業中有什麼解決方案

  4. 這些解決方案分別有什麼優缺點

  5. 別人是怎麼做的

  6. 我們可以怎麼來做


此次分享的緣由

支付重構

考慮支付重構的時候,自然想到原本屬於一個本地事務中的處理,現在要跨應用了要怎麼處理。拿充值訂單舉個慄子吧,假設:原本訂單模塊和賬戶模塊是放在一起的,現在需要做服務拆分,拆分成訂單服務,賬戶服務。原本收到充值回調後,可以將修改訂單狀態和增加金幣放在一個mysql事務中完成的,但是呢,因為服務拆分了,就面臨著需要協調2個服務才能完成這個事務

所以就帶出來,我們今天要分享和討論的話題是:怎麼解決分散式場景下數據一致性****問題,暫且用分散式事務來定義吧。

同樣的問題還存在於其他的場景:

送禮:

1.  調用支付服務:先扣送禮用戶的金幣,然後給主播加相應的荔枝

2.  確認第一步成功後,播放特效,發聊天室送禮評論等複製代碼

充值成功消息:

  1. 完成充值訂單

  2. 發送訂單完成的kafka消息

在涉及支付交易等付費介面的時候,數據一致性的問題就顯得尤為重要,因為都是錢****啊

目前分散式事務是怎麼解決的呢?

問題肯定不是新問題,也就是目前已經有相應的解決方案了,那就看一下現在是怎麼來解決這類問題的吧。

購買基礎商品成功發送支付訂單完成消息為例:

假設支付下單購買基礎商品,此刻已經收到支付回調,訂單已經處理成功了,這個時候kafka服務故障,消息發送失敗;而這個時候處理訂單的事務已經提交了,怎****麽保證訂單完成的消息一定能發出去呢?

解讀一下這個流程:

綠色部分,表示流程正常運行的交互過程:

  1. 先往JobController中提交一個job(用於故障恢復)

  2. 提交成功後,開始處理訂單邏輯

  3. 處理完訂單邏輯之後,開始發送kafka消息

  4. 消息也發送成功後,刪除第一步提交的job

黃色部分,表示流程出現了異常,數據可能存在不一致現象。這個時候就需要進行流程恢復

  1. JobController任務控制器定時去redis查詢延時任務列表(每個任務都有一個時間戳,按時間戳排序過濾)

  2. 將任務進行恢復(調用job註冊時定義的處理方法)

  3. 任務執行成功,表示流程完成;否則下一個定時周期重試

問題:

  1. 基於redis存儲恢復任務,可能存在數據丟失風險

  2. 架構體系中沒有統一的分散式事務規範,可否將這層邏輯獨立為分散式事務中間件

  3. 缺少事務執行策略管理,如:控制最大重試次數等

  4. 事務執行狀態沒有記錄,追查需要去翻看日誌


行業中有什麼解決方案

說解決方案之前,我們先瞭解一下這些方案的理論依據,有助於幫助我們來理解和實踐這些方案

理論依據(討論的前提)

本地事務、分散式事務

如果說本地事務是解決單個數據源上的數據操作的一致性問題的話,那麼分散式事務則是為瞭解決跨越多個數據源上數據操作的一致性問題。

強一致性、弱一致性、最終一致性

從客戶端角度,多進程併發訪問時,更新過的數據在不同進程如何獲取的不同策略,決定了不同的一致性。對於關係型資料庫,要求更新過的數據能被後續的訪問都能看到,這是強一致性。如果能容忍後續的部分或者全部訪問不到,則是弱一致性。如果經過一段時間後要求能訪問到更新後的數據,則是最終一致性

服務端角度,如何儘快將更新後的數據分佈到整個系統,降低達到最終一致性的時間視窗,是提高系統的可用度和用戶體驗非常重要的方面。對於分散式數據系統:

  • N — 數據複製的份數

  • W — 更新數據時需要保證寫完成的節點數

  • R — 讀取數據的時候需要讀取的節點數

如果W+R>N,寫的節點和讀的節點重疊,則是強一致性。例如對於典型的一主一備同步複製的關係型資料庫,N=2,W=2,R=1,則不管讀的是主庫還是備庫的數據,都是一致的。

如果W+R<=N,則是弱一致性。例如對於一主一備非同步複製的關係型資料庫,N=2,W=1,R=1,則如果讀的是備庫,就可能無法讀取主庫已經更新過的數據,所以是弱一致性。

CAP理論

分散式環境下(數據分佈)要任何時刻保證數據一致性是不可能的,只能採取妥協的方案來保證數據最終一致性。這個也就是著名的CAP定理。推薦閱讀:分散式系統架構常識:CAP理論。

需要明確的一點是,對於一個分散式系統而言,分區容錯性是一個最基本的要求。因為 既然是一個分散式系統,那麼分散式系統中的組件必然需要被部署到不同的節點,否則也就無所謂分散式系統了,因此必然出現子網路。而對於分散式系統而言,網 絡問題又是一個必定會出現的異常情況,因此分區容錯性也就成為了一個分散式系統必然需要面對和解決的問題。因此系統架構師往往需要把精力花在如何根據業務 特點在C(一致性)和A(可用性)之間尋求平衡。

BASE 理論

BASE是Basically Available(基本可用)、Soft state(軟狀態)和Eventually consistent(最終一致性)三個短語的縮寫。BASE理論是對CAP中一致性和可用性權衡的結果,其來源於對大規模互聯網系統分散式實踐的總結, 是基於CAP定理逐步演化而來的。BASE理論的核心思想是:即使無法做到強一致性,但每個應用都可以根據自身業務特點,採用適當的方式來使系統達到最終一致性。

BASE理論面向的是大型高可用可擴展的分散式系統,和傳統的事物ACID特性是相反的,它完全不同於ACID的強一致性模型,而是通過犧牲強一致性來獲得可用性,並****允許數據在一段時間內是不一致的,但最終達到一致狀態。但同時,在實際的分散式場景中,不同業務單元和組件對數據一致性的要求是不同的,因此在具體的分散式系統架構設計過程中,ACID特性和BASE理論往往又會結合在一起。

柔性事務

不同於ACID的剛性事務,在分散式場景下基於BASE理論,就出現了柔性事務的概念。要想通過柔性事務來達到最終的一致性,就需要依賴於一些特性,這些特性在具體的方案中不一定都要滿足,因為不同的方案要求不一樣;但是都不滿足的話,是不可能做柔性事務的。

可見性(對外可查詢)

在分散式事務執行過程中,如果某一個步驟執行出錯,就需要明確的知道其他幾個操作的處理情況,這就需要其他的服務都能夠提供查詢介面,保證可以通過查詢來判斷操作的處理情況。

為了保證操作的可查詢,需要對於每一個服務的每一次調用都有一個全局唯一的標識,可以是業務單據號(如訂單號)、也可以是系統分配的操作流水號(如支付記錄流水號)。除此之外,操作的時間信息也要有完整的記錄。

冪等操作

冪等性,其實是一個數學概念。冪等函數,或冪等方法,是指可以使用相同參數重覆執行,並能獲得相同結果的函數。推薦閱讀:服務高可用:冪等性設計

f(f(x)) = f(x)

在編程中一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。也就是說,同一個方法,使用同樣的參數,調用多次產生的業務結果與調用一次產生的業務結果相同。這一個要求其實也比較好理解,因為要保證數據的最終一致性,很多解決防範都會有很多重試的操作,如果一個方法不保證冪等,那麼將無法被重試。冪等操作的實現方式有多種,如在系統中緩存所有的請求與處理結果、檢測到重覆操作後,直接返回上一次的處理結果等。

業界方案

兩階段提交(2PC)

XA是X/Open CAE Specification (Distributed Transaction Processing)模型中定義的TM(Transaction Manager)與RM(Resource Manager)之間進行通信的介面。

在XA規範中,資料庫充當RM角色,應用需要充當TM的角色,即生成全局的txId,調用XAResource介面,把多個本地事務協調為全局統一的分散式事務。

二階段提交是XA的標準實現。它將分散式事務的提交拆分為2個階段:prepare和commit/rollback。

2PC模型中,在prepare階段需要等待所有參與子事務的反饋,因此可能造成資料庫資源鎖定時間過長,不適合併發高以及子事務生命周長較長的業務場景。兩階段提交這種解決方案屬於犧牲了一部分可用性來換取的一致性。

saga

saga的提出,最早是為瞭解決可能會長時間運行的分散式事務(long-running process)的問題。所謂long-running的分散式事務,是指那些企業業務流程,需要跨應用、跨企業來完成某個事務,甚至在事務流程中還需要有手工操作的參與,這類事務的完成時間可能以分計,以小時計,甚至可能以天計。這類事務如果按照事務的ACID的要求去設計,勢必造成系統的可用性大大的降低。試想一個由兩台伺服器一起參與的事務,伺服器A發起事務,伺服器B參與事務,B的事務需要人工參與,所以處理時間可能很長。如果按照ACID的原則,要保持事務的隔離性、一致性,伺服器A中發起的事務中使用到的事務資源將會被鎖定,不允許其他應用訪問到事務過程中的中間結果,直到整個事務被提交或者回滾。這就造成事務A中的資源被長時間鎖定,系統的可用性將不可接受。

saga,則是一種基於補償的消息驅動的用於解決long-running process的一種解決方案。目標是為了在確保系統高可用的前提下儘量確保數據的一致性。還是上面的例子,如果用saga來實現,那就是這樣的流程:伺服器A的事務先執行,如果執行順利,那麼事務A就先行提交;如果提交成功,那麼就開始執行事務B,如果事務B也執行順利,則事務B也提交,整個事務就算完成。但是如果事務B執行失敗,那事務B本身需要回滾,這時因為事務A已經提交,所以需要執行一個補償操作,將已經提交的事務A執行的操作作反操作,恢復到未執行前事務A的狀態。這樣的基於消息驅動的****實現思路,就是saga。我們可以看出,saga是犧牲了數據的強一致性,僅僅實現了最終一致性,但是提高了系統整體的可用性。

補償事務(TCC)

TCC 其實就是採用的補償機制,其核心思想是:針對每個操作,都要註冊一個與其對應的確認和補償(撤銷)操作。TCC模型是把鎖的粒度完全交給業務處理。它分為三個階段:

  1. Try 階段主要是對業務系統做檢測及資源預留

  2. Confirm 階段主要是對業務系統做確認提交,Try階段執行成功並開始執行 Confirm階段時,預設 Confirm階段是不會出錯的。即:只要Try成功,Confirm一定成功。

  3. Cancel 階段主要是在業務執行錯誤,需要回滾的狀態下執行的業務取消,預留資源釋放。

下麵對TCC模式下,A賬戶往B賬戶匯款100元為例子,對業務的改造進行詳細的分析:

匯款服務和收款服務分別需要實現,Try-Confirm-Cancel介面,併在業務初始化階段將其註入到TCC事務管理器中。、

[匯款服務]
Try:
   檢查A賬戶有效性,即查看A賬戶的狀態是否為“轉帳中”或者“凍結”;
   檢查A賬戶餘額是否充足;
   從A賬戶中扣減100元,並將狀態置為“轉賬中”;
   預留扣減資源,將從A往B賬戶轉賬100元這個事件存入消息或者日誌中;
Confirm:
 不做任何操作;
Cancel:
   A賬戶增加100元;
 從日誌或者消息中,釋放扣減資源。

[收款服務]
Try:
 檢查B賬戶賬戶是否有效;
Confirm:
   讀取日誌或者消息,B賬戶增加100元;
   從日誌或者消息中,釋放扣減資源;
Cancel:
 不做任何操作。

由此可以看出,TCC模型對業務的侵入強,改造的難度大。

本地消息表(非同步確保)

本地消息表這種實現方式應該是業界使用最多的,其核心思想是將分散式事務拆分成本地事務進行處理,這種思路是來源於ebay。我們可以從下麵的流程圖中看出其中的一些細節:

基本思路就是:

消息生產方,需要額外建一個消息表,並記錄消息發送狀態。消息表和業務數據要在一個事務里提交,也就是說他們要在一個資料庫裡面。然後消息會經過MQ發送到消息的消費方。如果消息發送失敗,會進行重試發送。

消息消費方,需要處理這個消息,並完成自己的業務邏輯。此時如果本地事務處理成功,表明已經處理成功了,如果處理失敗,那麼就會重試執行。如果是業務上面的失敗,可以給生產方發送一個業務補償消息,通知生產方進行回滾等操作。

生產方和消費方定時掃描本地消息表,把還沒處理完成的消息或者失敗的消息再發送一遍。如果有靠譜的自動對賬補賬邏輯,這種方案還是非常實用的。

事務消息

事務消息作為一種非同步確保型事務, 將兩個事務分支通過MQ進行非同步解耦,事務消息的設計流程同樣借鑒了兩階段提交理論,整體交互流程如下圖所示:

  1. 事務發起方首先發送prepare消息到MQ。

  2. 在發送prepare消息成功後執行本地事務。

  3. 根據本地事務執行結果返回commit或者是rollback。

  4. 如果消息是rollback,MQ將刪除該prepare消息不進行下發,如果是commit消息,MQ將會把這個消息發送給consumer端。

  5. 如果執行本地事務過程中,執行端掛掉,或者超時,MQ將會不停的詢問其同組的其它producer來獲取狀態。

  6. Consumer端的消費成功機制有MQ保證。

有一些第三方的MQ是支持事務消息的,比如RocketMQ,但是市面上一些主流的MQ都是不支持事務消息的,比如 RabbitMQ 和 Kafka 都不支持。

盡最大努力通知

最大努力通知方案主要也是藉助MQ消息系統來進行事務控制,這一點與可靠消息最終一致方案一樣。看來MQ中間件確實在一個分散式系統架構中,扮演者重要的角色。最大努力通知方案是比較簡單的分散式事務方案,它本質上就是通過定期校對,實現數據一致性。

最大努力通知方案的實現

  1. 業務活動的主動方,在完成業務處理之後,向業務活動的被動方發送消息,允許消息丟失。

  2. 主動方可以設置時間階梯型通知規則,在通知失敗後按規則重覆通知,直到通知N次後不再通知。

  3. 主動方提供校對查詢介面給被動方按需校對查詢,用於恢復丟失的業務消息。

  4. 業務活動的被動方如果正常接收了數據,就正常返迴響應,並結束事務。

  5. 如果被動方沒有正常接收,根據定時策略,向業務活動主動方查詢,恢復丟失的業務消息

最大努力通知方案的特點

  1. 用到的服務模式:可查詢操作、冪等操作。

  2. 被動方的處理結果不影響主動方的處理結果;

  3. 適用於對業務最終一致性的時間敏感度低的系統;

  4. 適合跨企業的系統間的操作,或者企業內部比較獨立的系統間的操作,比如銀行通知、商戶通知等;

方案比較

別人是怎麼做的

alipay的分散式事務服務DTS

分散式事務服務(Distributed Transaction Service,簡稱 DTS)是一個分散式事務框架,用來保障在大規模分散式環境下事務的最終一致性。DTS 從架構上分為 xts-client 和 xts-server 兩部分,前者是一個嵌入客戶端應用的 Jar 包,主要負責事務數據的寫入和處理;後者是一個獨立的系統,主要負責異常事務的恢復。

核心概念

在 DTS 內部,我們將一個分散式事務的關聯方,分為發起方和參與者兩類:

發起方: 分散式事務的發起方負責啟動分散式事務,觸發創建相應的主事務記錄。發起方是分散式事務的協調者,負責調用參與者的服務,並記錄相應的事務日誌,感知整個分散式事務狀態來決定整個事務是 COMMIT 還是 ROLLBACK。

參與者:參與者是分散式事務中的一個原子單位,所有參與者都必須在一階段介面(Prepare)中標註(Annotation)參與者的標識,它定義了 prepare、commit、rollback 3個基本介面,業務系統需要實現這3個介面,並保證其業務數據的冪等性,也必須保證 prepare 中的數據操作能夠被提交(COMMIT)或者回滾(ROLLBACK)。從存儲結構上,DTS 的事務狀態數據可以分為主事務記錄(Activity)和分支事務記錄(Action)兩類:

主事務記錄 Activity:主事務記錄是整個分散式事務的主體,其最核心的數據結構是事務號(TX_ID)和事務狀態(STATE),它是在啟動分散式事務的時候持久化寫入資料庫的,它的狀態決定了這筆分散式事務的狀態。

分支事務記錄 Action:分支事務記錄是主事務記錄的一個子集,它記錄了一個參與者的信息,其中包括參與者的 NAME 名稱,DTS 通過這個 NAME 來唯一定位一個參與者。通過這個分支事務信息,我們就可以對參與者進行提交或者回滾操作。

這應該屬於我們上面所說的TCC模式。

eBay 本地消息表

本地消息表這種實現方式的思路,其實是源於ebay,後來通過支付寶等公司的佈道,在業內廣泛使用。其基本的設計思想是將遠程分散式事務拆分成一系列的本地事務。如果不考慮性能及設計優雅,藉助關係型資料庫中的表即可實現。

舉個經典的跨行轉賬的例子來描述。第一步,扣款1W,通過本地事務保證了憑證消息插入到消息表中。第二步,通知對方銀行賬戶上加1W了。那問題來了,如何通知到對方呢?

通常採用兩種方式:

  1. 採用時效性高的MQ,由對方訂閱消息並監聽,有消息時自動觸發事件

  2. 採用定時輪詢掃描的方式,去檢查消息表的數據。

類似使用本地消息表+消息通知的還有去哪兒,蘑菇街

各種第三方支付回調

最大努力通知型。如支付寶、微信的支付回調介面方式,不斷回調直至成功,或直至調用次數衰減至失敗狀態。

我們可以怎麼來做

2PC/3PC需要資源管理器(mysql, redis)支持XA協議,且整個事務的執行期間需要鎖住事務資源,會降低性能。故先排除。

TCC的模式,需要事務介面提供try,confirm,cancel三個介面,提高了編程的複雜性。需要依賴於業務方來配合提供這樣的介面。推行難度大,暫時排除。

最大努力通知型,應用於異構或者服務平臺當中

可以看到ebay的經典模式中,分散式的事務,是通過本地事務+可靠消息,來達到事務的最終一致性的。但是出現了事務消息,就把本地事務的工作給涵蓋在事務消息當中了。所以,接下來要基於事務消息來套我們的應用場景,看起是否滿足我們對分散式事務產品的要求。

關註公眾號Java技術棧回覆"面試"獲取我整理的2020最全面試題及答案。

推薦去我的博客閱讀更多:

1.Java JVM、集合、多線程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、後端、架構、阿裡巴巴等大廠最新面試題

覺得不錯,別忘了點贊+轉發哦!


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

-Advertisement-
Play Games
更多相關文章
  • 因為所出標簽太多,所以我們很難都用得上或者意識到需要用。 但其實也有許多有趣但是我們未曾發掘的標簽,本文所要介紹的 便是一個。 <dataList>是什麼? 標簽一個類似於 標簽一樣可以通過包裹 來表示控制項可選值的,唯一不同的就是 需要配合 來使用,而且 不表示任何內容,僅作展示。 我們康個慄子: ...
  • 本案例製作一個咖啡銷售網站,通過網站呈現自己的理念和咖啡文化,頁面佈局設計獨特,採用兩欄的佈局形式;頁面風格設計簡潔,為瀏覽者提供一個簡單、時尚的頁面,瀏覽時讓人心情舒暢。 1、網站概述網站的設計思路和設計風格與Bootstrap框架風格完美融合,下麵就來具體地介紹實現的步驟。 2、網站結構 本案例 ...
  • 盒模型 盒模型主要兩種,標準盒模型和怪異和模型 標準盒模型:width指content部分的寬度 怪異盒模型:width指content、padding、border的總寬度 解決方法:box-sizing屬性,值為content-box(標準盒模型),值為border-box(怪異盒模型) 垂直居 ...
  • /** * 對象、數組變化監聽(增刪改) * @author w-bing * @date 2020-04-22 * @param {Object} obj * @param {Function} cb * @return {Proxy} */ function deepProxy(obj, cb) ...
  • Laravel 如何在blade文件中使用Vue組件 1. 安裝laravel/ui依賴包 composer require laravel/ui 2.生成vue基本腳手架 php artisan ui react 系統還提供了非常便捷的auth腳手架,帶登錄註冊。 php artisan ui r ...
  • 一、Overview Angular 入坑記錄的筆記第七篇,介紹 Angular 中的模塊的相關概念,瞭解相關的使用場景,以及知曉如何通過特性模塊來組織我們的 Angular 應用 對應官方文檔地址: NgModule 簡介 NgModules JavaScript 模塊 vs. NgModule ...
  • 一、sentinel是什麼 sentinel的官方名稱叫分散式系統的流量防衛兵。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。在Spring Cloud項目中最開始我們使用的是Hystrix,目前已停止更新了。現在Spring Cloud官方推薦的是 ...
  • 老孟導讀:【Flutter實戰】系列文章地址:http://laomengit.com/guide/introduction/mobile_system.html 預設情況下,Flutter 的滾動組件(比如 ListView)沒有顯示滾動條,使用 Scrollbar 顯示滾動條: Scrollba ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...