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