2017-07-25 65 views
1

我知道服務之間的同步通信是一種反模式,所以我正在爲我的用例尋找一個好的解決方案。微服務之間的同步REST通信的替代

我有這兩個服務:

  • Location Service管理用戶位置
  • Score Service管理用戶評分

現在,我必須建立另一個服務:Users Feed Service(UFS)。它必須將用戶返回給定位置,按照分數(降序)排序。

同步解決方案

  1. 給定的位置,UFS獲取從位置服務(REST)
  2. 對於他們中的每一個附近的用戶,它得到她的得分從分服務(REST)
  3. 最後,它對內存中的用戶進行排序並返回它們

什麼是替代方案?我一直在思考這樣的事情:

事件隊列解決方案

  • UFS在數據庫中,或內存緩存或東西
  • 它偵聽到的變化在隊列中來店用戶的位置和分數當得分服務和位置服務發佈時更新其數據

這樣,當客戶端請求用戶的feed時,用戶的feed服務不必執行任何網絡請求(它擁有必要的數據)

這是一個很好的解決方案嗎?我該如何改進它?它會擴展到大量的用戶嗎?

+0

它會比同步解決方案的規模更好。隊列比API更好,處理量更大。但是,您必須克服排隊運輸基礎設施的複雜性。你確定你沒有過早優化嗎? –

+0

也許我是。但我擔心未來的變化。從同步到基於隊列的系統的遷移可能很難。無論如何,我認爲你是對的。也許我試圖解決不存在的可伸縮性問題。謝謝 –

回答

1

也許你有一些額外的要求,你沒有列出,但在我看來,在這種情況下,基於事件的解決方案,將從其他服務複製大量數據是工程的方式。

如果當有位置服務 - 改變的話很有道理其調用綁到從位置服務未來的變化位置

至於得分服務的事件UFS得到的位置,我'd保持同步,但使其界面接受客戶名單,而不是讓客戶成爲「獲得客戶分數」的電話。

+0

感謝您的回答。我如何處理大量的用戶?我應該將它分成多次與分數服務通話嗎? –

+0

取決於什麼是大?您可以更改分數服務API,以便它可以接受客戶列表並返回分數最高的X客戶端 - (最高爲m),那麼您必須來回傳輸少得多的數據 –