摘要:分布式事務(wù)一直是微服務(wù)的一個難點。相關(guān)的解決方案和框架大部分是的,那么該如何解決呢下面一步一步講解如何用解決分布式事務(wù)??蚣軜O簡高性能松耦合分布式可運行于多種環(huán)境框架完美支持上面的要求。
分布式事務(wù)一直是微服務(wù)的一個難點。相關(guān)的解決方案和框架大部分是java的,那么php該如何解決呢?下面一步一步講解如何用php解決分布式事務(wù)。
單機單數(shù)據(jù)源事務(wù)首先從單機事務(wù)開始。
大概邏輯如下 :
try { // 開始事務(wù) $db->beginTransaction(); // 執(zhí)行你的操作 // ... // 提交事務(wù) $db->commit(); } catch (Exception $e) { // 執(zhí)行失敗 回滾 $db->rollBack(); }單機多個數(shù)據(jù)源事務(wù)
如果你業(yè)務(wù)涉及到多個數(shù)據(jù)庫,事務(wù)大概邏輯是這個樣子:
try { // 開始事務(wù) $db1->beginTransaction(); $db2->beginTransaction(); // 執(zhí)行你的操作 // ... // 提交事務(wù) $db1->commit(); $db2->commit(); } catch (Exception $e) { // 執(zhí)行失敗 回滾 $db1->rollBack(); $db2->rollBack(); }多機多數(shù)據(jù)源事務(wù)(分布式事務(wù))
如果你的數(shù)據(jù)源和業(yè)務(wù)代碼都是分開的(微服務(wù))這就是我們今天的核心。
由前面兩種情況來看,大概邏輯是差不多的,主要也分為4個步驟。
開始事務(wù)
執(zhí)行邏輯代碼
提交事務(wù)
回滾事務(wù)
有些文章也稱為tcc也就是 234 步驟。
我們用一個常用的例子:下單。
主要3個步驟:
創(chuàng)建訂單
修改庫存
修改用戶積分
假設(shè)訂單,庫存,用戶都是獨立的服務(wù)。
按照前面的經(jīng)驗大概分為4個步驟,我們以用戶為例 代碼如下:
class User { // 開始事務(wù) public function beginTransaction() { $db->beginTransaction(); return $this; } // 執(zhí)行代碼 public function doTransaction() { // 執(zhí)行你的操作 // ... return $this; } public function commit() { $db->commit(); } public funtion rollBack() { $db->rollBack(); } }
庫存(stock),訂單(order)和上面類似,也需要這4個方法,我就不寫了。
難點在于我們沒法直接操作數(shù)據(jù)源,只能通過rpc調(diào)用相應(yīng)的服務(wù)來操作。依次執(zhí)行上面的方法就好了。代碼如下:
try { // 開始事務(wù) $user = new User(); $stock = new Stock(); $order = new Order(); $user = $user->beginTransaction(); $stock = $stock->beginTransaction(); $order = $order->beginTransaction(); // 執(zhí)行你的操作 $user = $user->doTransaction(); $stock = $stock->doTransaction(); $order = $order->doTransaction(); // 提交事務(wù) $user->commit(); $stock->commit(); $order->commit(); } catch (Exception $e) { // 執(zhí)行失敗 回滾 $user->rollBack(); $stock->rollBack(); $order->rollBack(); }
到這里可能有人看出問題來了,正常情況下這樣肯定是不行的。要上面這段代碼成立需要滿足1個條件:User分別調(diào)用了3次,也就是3個請求。要保證這3個請求是調(diào)用的同一個實例化后的對象。Stock和Order一樣。
User 調(diào)用邏輯如下:
// 第一次請求調(diào)用 $user = new User(); $user = $user->beginTransaction(); // 第二次請求調(diào)用 復(fù)用的第一次 $user $user = $user->doTransaction(); // 第三次請求調(diào)用 復(fù)用的第一次 $user $user->commit(); //或者 $user->rollBack();
注意: 雖然調(diào)用了3次但是只new了一次, 第二次和第三次請求是復(fù)用的第一次的對象。要滿足這個條件 服務(wù)供方必須 常駐內(nèi)存 ,而且提供的rpc服務(wù)必須支持鏈式調(diào)用的功能。
one框架 https://github.com/lizhichao/one
極簡 . 高性能 . 松耦合 . 分布式 . 可運行于多種環(huán)境
one框架完美支持上面的要求。只需要把上面的User、Stock和Order添加為rpc服務(wù)即可。還需要注意beginTransaction和doTransaction方法必須返回$this提供給后面的方法調(diào)用。
user服務(wù)如下:
RpcServer::add(User::class);
其他兩個類似。到此分布式事務(wù)問題就搞定了,可能覺得這么簡單嗎?這主要由于one框架的rpc服務(wù)提供了鏈式調(diào)用(多個請求復(fù)用同一個對象)的功能。
可能有人要問:如果因為網(wǎng)絡(luò)問題或者其他問題導(dǎo)致最后一個服務(wù)的最后一次調(diào)用失敗了怎么辦?
解決方案就是事務(wù)補償,你可以把這類極端的情況下的錯誤,放到一個隊列里 起一服務(wù)來專門處理這里問題。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/31504.html
摘要:前幾天寫一篇,一種新思路實現(xiàn)分布式事務(wù)的文章。寫個分布式事務(wù)就有人開始噴了事務(wù)提交了,怎么回滾都知道怎么回滾。 前幾天寫一篇 , 一種新思路實現(xiàn)分布式事務(wù)的文章。https://segmentfault.com/a/11... 部分死腦筋就開始,各種不解??捶答?確實有點搞笑。 不要一聽到 session 就覺得是 $_SEESION不要別人換個名字 token 或者 jwt 就不認識...
摘要:微服務(wù)做的事情是按照項目顆粒度進行服務(wù)的拆分,把模塊單獨拿出來做成每一個單獨的小項目。給我們提供了的底層服務(wù),我們并不需要去關(guān)心底層通訊細節(jié)和調(diào)用的過程。通過定義接口,實現(xiàn)接口,啟動提供接口服務(wù)。 RPC 服務(wù) RPC,是一種遠程調(diào)用方式(Remote Procedure Call),通過RPC我們可以像調(diào)用本地方法一樣調(diào)用別的機器上的方法,用戶將無感服務(wù)器與服務(wù)器之間的通訊。RPC在...
摘要:它是第一個把數(shù)據(jù)分布在全球范圍內(nèi)的系統(tǒng),并且支持外部一致性的分布式事務(wù)。目的是使得開發(fā)者閱讀之后,能對項目有一個初步了解,更好的參與進入的開發(fā)中。深度探索數(shù)據(jù)庫并發(fā)控制技術(shù)并發(fā)控制技術(shù)是數(shù)據(jù)庫事務(wù)處理的核心技術(shù)。 存儲過程高級篇 講解了一些存儲過程的高級特性,包括 cursor、schema、控制語句、事務(wù)等。 數(shù)據(jù)庫索引與事務(wù)管理 本篇文章為對數(shù)據(jù)庫知識的查缺補漏,從索引,事務(wù)管理,...
摘要:后端好書閱讀與推薦系列文章后端好書閱讀與推薦后端好書閱讀與推薦續(xù)后端好書閱讀與推薦續(xù)二后端好書閱讀與推薦續(xù)三后端好書閱讀與推薦續(xù)四這里依然記錄一下每本書的亮點與自己讀書心得和體會,分享并求拍磚。 后端好書閱讀與推薦系列文章:后端好書閱讀與推薦后端好書閱讀與推薦(續(xù))后端好書閱讀與推薦(續(xù)二)后端好書閱讀與推薦(續(xù)三)后端好書閱讀與推薦(續(xù)四) 這里依然記錄一下每本書的亮點與自己讀書心得...
閱讀 738·2021-11-15 11:37
閱讀 4232·2021-09-09 09:34
閱讀 3639·2019-08-30 15:52
閱讀 2679·2019-08-29 14:03
閱讀 2919·2019-08-26 13:36
閱讀 1656·2019-08-26 12:16
閱讀 1653·2019-08-26 11:45
閱讀 3560·2019-08-23 18:41