2015-02-07 52 views
2

我正在構建一個網站後端,它涉及客戶端提交請求以執行一些昂貴(及時)的操作。昂貴的操作還涉及收集一些信息以完成。將數據推入隊列vs通過工作人員提取數據

客戶提交的作品可以通過uuid完整描述。我希望使用面向服務的體系結構(SOA)(即多個微服務)。

客戶端通過HTTP使用RESTful通信與後端進行通信。我計劃使用一個隊列,執行昂貴操作的工作人員可以進行輪詢工作。隊列具有持久性,並提供可靠的語義。

其中一個考慮因素是我是否收集上游昂貴操作所需的所有數據,然後將所有數據排入隊列,或者我是否只排入uuid並讓工作人員獲取數據。

這裏有兩種架構的圖所考慮:

推送基於(即收集的上行數據): Push-based (i.e. gather data upstream)

基於拉的(即工人採集到的數據): Pull-based (i.e. worker gathers the data)

我想到的一些東西:

  1. 在基於推送的情況下,當我收集所需的數據時,我很可能會被阻止,因此客戶端的HTTP請求將不會被響應,直到數據被收集併入隊。從用戶界面的角度來看,請求會一直等待,直到響應回來。
  2. 在基於拉的場景中,只有工作人員需要知道工作需要哪些數據。這意味着我可以有多種類型的客戶端與各種後端進行交談。如果數據需要更改,我只更新工作人員,而不是每個上游服務。

我在這裏失蹤的其他東西?

回答

0

我想你已經非常解釋第二種(基於拉式)的方法更好。

  1. 如果無論如何都要異步處理用戶的請求,爲什麼要等待收集數據,然後返回響應。您只需排隊工作項並返回HTTP響應。
  2. 通過隊列傳遞數據不是一個好的選擇。如果你獲得數據上游,你將不得不通過隊列傳遞給工作者(通常是BLOB存儲)。這是您的情況並非真正需要的額外工作。
+0

我想我的問題是基於推送的方法有什麼優勢? – 2015-02-07 22:33:57

+0

基於對您的案例的高級描述,我不確定我是否真的看到了基於推送的方法的任何優勢。 – 2015-02-07 22:43:02

0

基於拉方法的另一個好處是您不必擔心隊列中的數據過時。