html服務流程如何實現 如何實現乙個流程引擎?

2021-10-13 16:41:09 字數 1746 閱讀 9013

先聊下之前遇到乙個場景,我們的業務會依賴好幾個系統,先呼叫a系統獲取部分資料,做部分計算,再呼叫b系統獲取一部分資料,再做部分計算,再呼叫c系統拿到一部分,再最終計算得到最終結果。

對於不同的產品,每個流程都會不同,呼叫的系統也會不同。

分析整個業務流程,會發現有幾個需要解決的問題:

前端是非同步呼叫,呼叫完成後,通過不斷輪詢的方式獲取結果,萬一被呼叫的某個系統響應超時了,整條業務就掛了,使用者拿不到最終資料。

現在基本所有應用都是分布式,呼叫完各系統之後基本都涉及計算,如果併發控制的不好,使用者對於同乙個資料做多次請求,可能會導致最終計算結果不正確。

這個非常典型的流程型業務,這個系統需要承載較多的類似的業務流程,需要被解決的問題也比較類似。

架構設計上需要解決乙個系統承載這麼多的業務流程的可維護問題,不同的流程之前**如何隔離,修改乙個業務的**如何更快速的分辨出是否會對其他業務造成影響。

解決技術上的通用性問題:在呼叫第三方系統的時候,如果發生了失敗,這個過程需要有自動恢復的能力,減少因為第三方系統不穩定問題帶來的業務失敗。在併發情況下,需要保證整個業務流程的併發安全。

基於上面的分析,把這個問題抽象出了「流程」,「任務」兩個領域,乙個業務對應乙個流程,乙個流程裡面包含多個任務,每個環節由不同的任務完成,在執行時,任務例項各自保證重試,併發安全等能力。

在這樣的抽象下,我們可以對我們的所有業務進行視覺化管理和操作。可以看到每個業務流程都包含哪些任務**,這樣就可以提公升我們的維護效率。

通過將失敗重試和併發保證的能力封裝在「任務」這個領域,就避免了在開發業務時需要關注這方面的技術問題。

對於領域的設計,我們可以分成兩大塊:定義和執行。針對每個新的業務,首先我們定義好流程,包含流程的名稱,業務描述,這個流程裡面包含多少個任務。

在執行的時候,使用流程例項工廠,從流程定義中生產出乙個流程例項執行。

首先要解決的是讓節點乙個乙個按照鏈的方式執行下來。所以在構建例項的時候,每個processinstance裡面會有乙個headertaskinstance作為頭節點,每個節點裡面會存下乙個要執行的節點的引用。

執行緒安全問題: 每個task的狀態包含執行,完成,錯誤三個狀態,在乙個task執行之前,首先拿到改task的鎖,然後執行task,執行完task後,釋放鎖。 如果執行的task例項儲存在資料庫中,可以基於資料庫的task行例項實現分布式鎖。

失敗重試: 失敗重試這種場景主要用於執行緒非同步執行的場景,乙個task執行失敗,狀態會進入error狀態,需要依賴乙個監聽執行緒,拉取失敗的task並重新執行。

流程在執行的時候,會根據條件的不同,執行不同的下乙個環節。這個時候,就需要提供具有路由能力的節點型別。也有可能會遇到某個任務是需要另外乙個執行緒觸發的,即需要乙個人工型別的任務節點。所以對於任務,會有不同的任務型別。

任務在重新執行的時候,所有的被執行的業務邏輯都需具備冪等性,這樣才能保證整體業務邏輯的一致性。

業界有比較成熟的bpmn流程引擎規範,也有很多已開源實現,為什麼要自己實現乙個流程引擎?

流程引擎對業務有比較強的侵入,不同的業務場景,對流程引擎的個性化能力要求也有不同,自己實現可能更好的服務自己的業務場景,遇到問題可以完全hold住。

python實現多型 如何用python實現多型性

建立乙個名為 func 的函式,它將獲取乙個我們將其命名為 obj 的物件。雖然我們使用的名稱是 obj 但是任何例項化的物件都可以被呼叫到這個函式中。用函式實現多型性 class india def capital self print new delhi is the capital of in...

如何實現微服務架構

一 技術選型 相對單體應用的交付,微服務應用交付要複雜得多,不僅需要開發框架支援,還需要一些自動化部署的工具,以及iaas paas或caas的支援。下面從開發和執行平台兩個維度考慮挑選技術選型 1 開發框架的選擇 可使用spring cloud作為微服務開發框架。首先,spring cloud具備...

如何使用html?

標籤由一組尖括號組成 語言 html有獨有的語言規範 1.忽略大小寫,對大小寫不敏感 2.都是由標籤組成,尖括號基本成對出現 3.標籤可以巢狀使用 4.標籤可以存在乙個或多個屬性,屬性和值通過 連線 5.html就是學不同標籤的不同表現形式 6.html標籤中的文字稱之為文字節點或者叫做文字值 1....