PHP:消息系統-消息事物模式(代碼全篇)

目錄介紹

  • MessageTr.php 消息事物類
  • Business.php 主業務類
  • BusinessDb.php DB事物類

MessageTr.php

<?php

/*** 消息事物類
 * Class MessageTr
 */
class MessageTr
{
    /**
     * 消息標籤
     */
    const MT_TAG_SEND   = 1 ;  #未發送
    const MT_TAG_SURE   = 2 ;  #確認發送
    const MT_TAG_OK     = 3 ;  #發送成功
    const MT_TAG_CANCEL = 0 ;  #已取消

    /** 請求發送消息
     * @param array ...$params
     * @return int
     */
    public function mtSend(...$params)
    {
        //根據 $params 進行處理
        //只記錄消息數據不發送消息,標記消息爲1
        //返回消息惟一標識
        return rand(1,10000);
    }

    /** 確認發送消息
     * @param $uniqueId
     */
    public function mtSure($uniqueId)
    {
        //根據 $uniqueId 對消息進行處理
        //發送消息數據,標記消息爲2
        //消息發送成功後,標記消息爲3
    }

    /** 取消發送消息
     * @param $uniqueId
     */
    public function mtCancel($uniqueId)
    {
        //根據 $uniqueId 對消息進行處理
        //標記消息爲0
    }

    /**
     *  按期確認 tag 爲 0 和 1 的數據
     */
    public function mtJob()
    {
        //請求消息來源方,確認爲廢消息後移除數據
    }

    /**
     * 消息補償,最終一致性
     */
    public function mtRecoup()
    {
        //獲取消息 tag 爲 2 的數據,保持數據一致性
    }
}

Business.php

<?php

/** 主業務類
 * Class Business
 */
class Business
{
    /** 消息事物類
     * @var MessageTr
     */
    private $messageTr ;

    public function init()
    {
        //初始化
        $this->messageTr = new MessageTr();
    }

    /**
     * 業務處理
     */
    public function deal()
    {
        //初始化
        $this->init();
        /** 發送消息事物請求
         * @var $uniqueId string 消息事物返回的惟一標識
         */
        $uniqueId = $this->messageTr->mtSend();
        //記錄本地消息
        $this->message();
        //事物
        $tr = new BusinessDb();
        $tr->trBegin();
        //TCC事物模型 try-commit-cancel
        try{
            //業務處理 do something
            //事物提交
            $tr->trCommit();
            //確認發送消息事物
            $this->messageTr->mtSure($uniqueId);
            //改變本地消息
            $this->message();
        }catch (Exception $exception){
            //事物回滾
            $tr->trRollback();
            //回滾消息事物
            $this->messageTr->mtCancel($uniqueId);
            //改變本地消息
            $this->message();
        }
    }

    public function message()
    {
        //記錄消息的發送,確認發送,回滾
    }
}

BusinessDb.php

<?php

/** 主業務DB
 * Class BusinessDb
 */
class BusinessDb
{
    public  function trBegin()
    {
        //開啓事物
    }

    public  function trCommit()
    {
        //提交事物
    }

    public  function trRollback()
    {
        //事物回滾
    }
}

圖解

圖片描述

相關文章
相關標籤/搜索