如何用RabbitMQ和Swoole實現(xiàn)一個異步任務系統(tǒng)_第1頁
如何用RabbitMQ和Swoole實現(xiàn)一個異步任務系統(tǒng)_第2頁
如何用RabbitMQ和Swoole實現(xiàn)一個異步任務系統(tǒng)_第3頁
全文預覽已結(jié)束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第如何用RabbitMQ和Swoole實現(xiàn)一個異步任務系統(tǒng)從圖中可以看到,我們這個系統(tǒng)是一個基于事件的異步任務系統(tǒng)。就是說當一個事件產(chǎn)生時,生產(chǎn)者將事件拋給調(diào)度器,調(diào)度器負責查詢事件下有哪些任務,然后將這些任務丟到相應的隊列中,最后由消費者消費任務隊列中的任務。

在整個系統(tǒng)中主要分為三大部分

1.事件生產(chǎn)者,即產(chǎn)生消息事件的一方。

2.任務調(diào)度器(Scheduler),負責注冊事件并調(diào)度任務。

3.消費者(Worker),負責消費任務隊列中的任務。

事件生產(chǎn)者

事件生產(chǎn)者很簡單,在業(yè)務系統(tǒng)中直接調(diào)用即可,代碼如下。

require_onceDIR.'/../autoload.php';

useAsynclib\Ebats\Event;

$event=newEvent('order_paied');//定義事件

$event-setOptions(['order_id'='FB138020392193312']);//事件產(chǎn)生的參數(shù)

$event-publish();

}catch(Exception$exc){

echo$exc-getMessage();

}

任務調(diào)度器

調(diào)度器主要做兩件事,一是注冊事件,另一個是調(diào)度任務。

注冊事件代碼如下:

//注冊事件

EventManager::register('order_create','closeOrder','demo',10);//關閉未付款訂單(延遲任務)

EventManager::register('order_paied','virtualShipping','demo');//虛擬商品自動發(fā)貨

這樣就注冊了兩個事件,事件下各有一個任務。

具體調(diào)度部分代碼很簡單,就不多贅述,有興趣的可以去看代碼。

重頭戲來了,一個異步任務系統(tǒng)最重要的就是消費端了,現(xiàn)在讓我們來看下Worker的流程圖。

可以看到,在這里我們采用了兩個交換器和兩個隊列,一個負責處理正常的任務即ntask,另一個負責處理需要延遲執(zhí)行的任務即dtask。簡單描述下一個任務的生命周期。

1、task產(chǎn)生,進入正常任務的交換器Exchange[ebats_core_ntask]

2、交換器根據(jù)topic將任務分發(fā)到對應的隊列中

3、子進程ntask阻塞等待成功獲取到task,并執(zhí)行該任務

4、執(zhí)行失敗,需要重試時拋出RetryException,不需要重試時拋出TaskException

5、子進程ntask捕獲到重試異常將任務拋給延遲任務的交換器Exchange[ebats_core_dtask]

6、將任務執(zhí)行信息回調(diào)給上層開發(fā)者以便保存查看

1、子進程dtask阻塞等待成功獲取到task,并執(zhí)行該任務

2、執(zhí)行失敗,需要重試時拋出RetryException,不需要重試時拋出TaskException

3、子進程dtask捕獲到重試異常將任務拋給延遲任務的交換器Exchange[ebats_core_dtask]

4、將任務執(zhí)行信息回調(diào)給上層開發(fā)者以便保存查看

消費者代碼如下:

require_onceDIR.'/../autoload.p

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論