2012-09-09 33 views
3

將NServiceBus Sagas與REST API集成/交互的最明智的方法是什麼?NServiceBus Sagas和REST API集成最佳實踐

的情況如下,

  • 我們有一個負載均衡的REST API。根據負載情況,我們可以添加更多節點。
  • REST API是一個DomainServices API的包裝。這意味着API可以直接使用。
  • 我們想使用薩加斯的工作流程和實施NServiceBus分銷商向外擴展。

問題是,如果我們使用Sagas的REST API,實際的處理過程發生在API場中。這在某種程度上破壞了實施分銷商模式的目的。

另一方面,直接從Sagas使用DomainServives API,允許在工作節點中本地處理。採用這種方法,我們將不得不在多個地點維護API程序集,但吞吐量可能會更高。

我想了解最佳方法。就個人而言,我更喜歡使用API​​(如果可用),但這可能會給系統帶來煩瑣的感覺,並且可能需要更長的時間才能完成。

一個典型的順序可能是類似於發佈的在線廣告,

  • 廣告主提交通過一個web應用程序的新廣告請求。
  • Web應用程序調用相關API端點併發送命令 消息。
  • 命令消息啓動新的發佈廣告Saga 實例。
  • 佐賀發送一個命令來驗證呼叫者權限(在 過程/縮小處理API調用)(/過程出處理的API調用的)
  • 佐賀發送一個命令以驗證 廣告數據
  • 佐賀發送 命令到欺詐服務(第三方服務)
  • 一旦內容和欺詐驗證成功,Saga向計費系統發送命令。
  • 佐賀調用API調用來保存添加細節。 (在 過程輸入/輸出處理的API調用的)

這繼續直到廣告期滿時,有許多的重試和故障條件的路徑。

+0

這個傳奇應該在擴展過程中解決的實際問題是什麼? –

+0

吞吐量,實際的佐賀是短跑的過程,它跑得比較快,不超過幾秒鐘,它可能會有一個單一的爆發。但是請求的數量很高,因此有一個分銷商可以幫助擴大規模。 或者,正如我所提到的,擁有一個負載平衡的API也可以做同樣的事情,因爲實際的工作發生在API節點上,工作節點進行協調。 –

+0

所以我理解這一點,你正在嘗試使用傳奇來調用一個負載平衡的Web服務?最重要的是,您希望有一個經銷商設置,以便您可以增加對此服務的呼叫數量?你需要一個傳奇嗎? – stephenl

回答

2

多項設計迭代,我們有以下指導原則上來後,

  1. 款待REST API層作爲整合平臺。
  2. 假設API端點能夠抽象相當複雜的微工作流。微型工作流程是在一次突發(不可中斷)中執行並在短時間內完成的操作(1秒鐘內完成)。
  3. 假設API場能夠爲多個併發請求提供服務,並且可以輕鬆擴展。
  4. 當目標操作非常簡單時,支持基於異步消息的調用的同步調用。
  5. 當需要異步處理時,使用單個消息處理程序並從處理程序中調用API。這會將工作委託給API場。這也將消除對分銷商和額外硬件資源的需求。
  6. 避免佐賀的,除非如果業務工作流程包含多個交易,補償邏輯和簡歷。測試顯示薩加斯在負載下表現不佳。
  7. 避免直接從消息處理程序中使用DomainServices。這直到本地完成工作,並通過分配業務邏輯引入部署麻煩。

很高興聽到你的想法。

0

你說得對,你需要薩加斯管理工作流程。我敢打賭,你的域名連接到一個共同的數據庫。如果這是真的,那麼直接使用您的域並刪除序列化/網絡開銷將會更快。您也將失去在數據庫級別輕鬆管理事務的能力。

假設您正在直接調用您的域,則表現會成爲域如何執行的問題。您可能會採取措施來優化數據庫,降低分佈式事務成本,分解數據等等。您最終可能會使用分發服務器來擁有多個Saga處理節點,但聽起來好像在設計完成後還需要做更多的測試選擇。一般來說,我們使用REST API將命令建模爲資源(通過POST),以允許與沒有直接訪問消息的客戶端交互NSB。這是從您的Web應用程序獲取NSB的潛在解決方案。