2014-10-01 93 views
3

我們正試圖儘可能地分離出我們的系統。我們理想地喜歡微服務只做一件事,而且一件事情很好。他們不應該知道依賴關係。他們應該從隊列中抽出一份工作,完成工作,並以某種方式發出一份完成工作的事件(我會回到這個)。如何在微服務架構中建模服務依賴關係?

我們的系統包含「快照」(圖片)作爲基礎,原子單位。 「事件」是最大長度爲5分鐘的快照分組。

一旦我們收到快照到我們的系統中,並確定它們屬於哪個事件,我們將這些快照排入RabbitMQ實例,以便執行一些圖像分析。然後我們有「快照分析儀」微服務拉下這個隊列並執行圖像分析。這些微服務直接寫入數據庫,爲圖像對象附加更多的元數據。這些也是無國籍的,並且易於水平擴展。

問題是,在快照分析儀已完成其工作後,有任務需要完成。如果我們檢測到快照上的某些屬性,我們希望使用「事件分析器」對該事件執行工作。我們不希望多次對此事件進行工作(因此,如果多個快照具有這些屬性,則無關緊要 - 我們仍然只想在事件上執行該操作)。這對於設計人員來說非常具有挑戰性,特別是在分佈式環境中,我們有幾個這樣的圖像分析儀正在退出隊列。我們目前所做的是,如果我們在快照上檢測到這些屬性(意味着我們希望在包含此快照的事件上完成工作),我們會將其寫入事件。如果是第一次寫入事件,我們將它排入我們的第二個隊列以進行事件處理。這確保了該事件只能排隊一次。是

與上述方法的問題如下:快照分析器和事件分析器生命快照分析器內部之間

  • 依賴。理想情況下,我希望快照分析器不瞭解事件分析器。它應該只是做它的工作,而不關心排隊的事情。我不確定這個依賴關係應該在哪裏編碼。
  • 找出排隊事件,當該事件的多個快照正在同時處理。如何只參加一次賽事的參賽作品。當調用$ set時,我們「濫用」MongoDB的原子更新,返回它是否成功。

有沒有人有任何想法或如何聲明相似的依賴關係的例子?我需要一個調度員服務,負責排隊等待正確的事情,並從一個工作完成隊列或其他東西拉。

回答

1

最終,您的問題是需要在全球範圍內同步分佈式處理系統。這是一個非常古老的問題,大多數人通過使用數據庫內置的功能來處理分佈式系統的同步,以完全修復它的方式修復它。還有很多其他的方法,但是如果你已經在使用一個很好的基礎設施(和大多數數據庫),那就繼續並利用它。

我想說的另一個問題(解耦快照分析器從事件分析器),你必須讓快照分析器意識到需求只分析一次事件(像你一樣),或有事件分析人員意識到這一要求。如果你的快照分析器只是爲事件分析器盲目排隊消息,並且讓事件分析器成爲數據庫避免重複處理的工作,那麼你將很好地封裝需求,同時向添加額外消息的警告隊列。這有一個好處,就是你有一個阻塞點,你可以將這些內容累積到一個阻塞點,而不必進行外部數據庫調用。