2016-04-21 132 views
0

我正在設計微服務體系結構中的審閱分析平臺。在微服務之間共享巨大的數據

應用程序是像下面的作品;從電子商務站點-A(站點一)檢索爲Excel

  • 所有產品意見文件
  • 評論上傳到系統與Excel
  • 分析代理可以列出所有的評論,編輯其中的一些,刪除或批准
  • 分析代理可以導出網站的所有評論-a
  • 基於自動正則表達式的檢查應用於每次上傳和編輯評論。

我有3個微服務。

  • 點評:負責類似批准/拒絕評論CRUD操作以及操作方法。
  • 驗證:負責制定和審覈應用驗證規則。
  • 導出/導入:出口服務出口給定站點的名稱(如網站-A)

問題是在某些時候大文件,驗證服務需要獲得所有評論網站一,應用驗證規則並且如果有的話會產生錯誤。我知道共享數據庫模式和實體會破壞微服務架構。

一個可能的解決方案是

  • 每當驗證服務需要一個現場審查,它要求網關,網關重定向請求評論服務和響應服用。

兩個這種方法的缺點可能是

  • 驗證服務知道有關網關?它是否會帶來依賴性?
  • 萬一我有一個網站的1b評論,通過休息請求獲得所有評論可能是一個問題。 (或沒有,我可以從驗證服務,使分頁請求的網關。)

那麼,什麼是分享微服務之間的巨大數據的最佳實踐,而不

  • 共享實體
  • 和dublicating的數據

我讀了很多關於使用消息隊列,但我認爲在我的情況下,使用消息隊列共享千兆字節的數據並不好。


編輯1:而不是共享實體,使用數據存儲與其餘API可以解決?假設我使用的是mongodb,而不是在微服務之間共享我的實體對象,我可以使用mongo的休息界面(http://restheart.org/)並儘可能查詢數據。

+0

您可以嘗試企業集成模式。我不知道哪種模式可以解決確切的用例,但應該包含它們。 – k1133

回答

0

我認爲評論是相互獨立的,因此驗證評論只需要評論,而不需要其他評論。

你不想共享實體,這就排除了共享數據庫,Hadoop集羣或像Redis這樣的數據存儲。您也不想複製數據,從而在數據庫級別排除純文本副本或基於觸發器的複製。

總之,我會說你的目標應該是一個流。讓Validator請求關於站點A的評論的所有內容,但不是一個批量,而是包含一個或多個評論包。

Validator現在可以在恆定的內存和處理器消耗下一個接一個地處理評論。爲了獲得性能,可以讓Validator的多個實例同時提取不同的,不相交的流片段。同樣,如果單獨一個人無法足夠快地回覆拉動,您可以創建多個評論微服務實例。

驗證器不保留這個流,它只產生錯誤並將它們存儲或發送到某個地方;這應該滿足您的不分享的重複要求。

+0

實際上,我們首先實現通過文件服務共享數據。源微服務正在導出文件並上傳到文件服務並將文件url發送到目標微服務。方法工作穩定,但因爲它的設計是複雜的,它成爲一個問題,以添加一個新的服務相同的時尚..開發和測試努力是高.. 現在我們切換到隊列流.. ..我們開始與兔子mq,但規劃切換到kafka也:) 總之,我們現在正在應用您的建議.. – ygk

2

這裏的問題不是「共享大量數據」,而是您選擇分離微服務的界限。

我可以從您的要求中瞭解到,您選擇分開的3個微服務(評估,驗證,導入/導出)實際上是在相同的上下文和業務域上運行的。

我鼓勵您重新考慮您的設計決策,並將評論視爲一項單一的微服務,將所有評論操作和邏輯視爲黑匣子。

+0

是的@Bishoy你可能是對的..但是當我開始合併在同一業務領域運行的服務時,它就變成了一個龐然大物。對我來說,驗證是完全不同的邏輯和領域。其實這個服務不知道它是否驗證審查或不只是在一些領域適用正則表達式.. – ygk

+0

這是一個很好的閱讀如何決定一個微服務應該是多大:http://www.ben- morris.com/how-big-is-a-microservice/ – Bishoy

+0

我真的認爲驗證不應該是一個不同的服務,它不是一個真正不同的域。是不是域特定的驗證規則是什麼等?我認爲試圖分裂這一點使得它非常複雜。 @ygok – Kaj