国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

php微服務(wù)之【分布式事務(wù)】

Tamic / 743人閱讀

摘要:分布式事務(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ì)象。StockOrder一樣。

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框架完美支持上面的要求。只需要把上面的UserStockOrder添加為rpc服務(wù)即可。還需要注意beginTransactiondoTransaction方法必須返回$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

相關(guān)文章

  • PHP 服務(wù)布式事務(wù)】閱讀提示

    摘要:前幾天寫(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í)...

    canger 評(píng)論0 收藏0
  • SwoftRPC服務(wù)介紹

    摘要:微服務(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在...

    娣辯孩 評(píng)論0 收藏0
  • database

    摘要:它是第一個(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ù)管理,...

    csRyan 評(píng)論0 收藏0
  • 后端好書(shū)閱讀與推薦(續(xù)四)

    摘要:后端好書(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ū)心得...

    phodal 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<