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