2017-08-24 27 views
3

我正在使用Spring Framework開發Web應用程序。我有兩個服務將存儲一些處理結果到數據庫中的一個表T中。邏輯目前是:兩個進程駐留在不同的AP服務器中,並引用相同的布爾標誌。 (Spring,Java)

服務A

for all items: 
    result = func(item) 
    store result to Table T (with status = new) 
is_running = False 

服務B

for some items: 
    if is_running == False: 
     result = func(item) 
     store result to Table T (with status = new) 
    else: 
     store result to Table T (with status = inprogress) 

布爾標誌is_running將在服務A.

由於我們有一個字段用於域服務器,服務A和服務B的MicroService Architechture可以駐留在不同的AP服務器中。如何確保服務A和服務B參考相同的is_running

是否可以使用Spring's bean scope來實現?

回答

0

Sprin是注入框架,本身並沒有這樣的功能。

我想重新寫你的問題如下:如何實現跨機器布爾標誌?

有很多方法可以做到這一點。最直接的方法是: 1.通過數據庫。您可以創建帶單列和單行的表格,您將在其中存儲標誌。你甚至可以在訪問表之前鎖定表格,以保證進程間的通信。 2.使用提供此類功能的其他工具。例如,我會推薦你​​Haselcast。這是一個Java網格,其他功能中包含原子變量,它們在不同的進程和機器之間共享狀態。順便說一句,他們也有春天融合。

0

簡短的回答,不,Spring,只是一個編程框架。它沒有做任何Java本身不會做的事情。跨進程交流就是這樣一個事情。正如所建議的那樣,您可以將該is_running標誌存儲在某個共享數據庫中,並讓這兩個服務在運行其邏輯之前訪問它。仍然有競爭條件,你需要考慮你的應用程序的胃口。
但是,邏輯可能不僅僅是那麼簡單,您甚至不會檢查使用給定狀態存儲的結果。必須有一些業務邏輯,這將使您可以利用同步邏輯來實施。提到的當前邏輯將始終取決於is_running標誌的時間點值。看起來不太對。

0

因爲我們講的是微服務,你是不允許在它們之間共享一個數據庫。一個微服務不應該依賴/瞭解/關心對方的技術堆棧。狀態由每個微服務所擁有,否則它不應該被認可,而是通過一個微服務API。

這就是說你需要一種技術不可知的方式來共享兩個微服務之間的布爾標誌。您可以同步或異步更新標誌,這取決於系統的彈性要求。您可以使用REST和JSON來隱藏技術堆棧。

如果共享數據庫,您將失去微服務體系結構的主要優點。

0

對於微服務架構,全局狀態爲

爲了解決您的問題,服務A和B都應該在其自己的數據庫中擁有自己的狀態(is_running),該數據庫與其他任何服務共享的不是

然後通過一個簡單的API /serviceA/state/serviceB/state公開這個狀態。這些端點應該返回狀態(通過JSON)。

然後每個服務應該調用其他服務的API來檢查其他服務的狀態。

相關問題