2017-07-16 87 views
1

當我們將更多的node.js代碼移植到Azure函數中時,我們在Azure文檔中看到了使用存儲隊列的參考,這是委派處理責任而不是使用http請求調用其他函數的首選方式。如何在請求/響應模式下使用Azure存儲隊列?

我們應該爲這個委派使用什麼樣的請求/響應設計模式?具體而言,如何通過隊列發回的響應僅發送到發出請求的函數?

這裏是我們想要做的一個例子:

  1. 請求進入到一個HTTP觸發功能A
  2. 功能A放置消息到隊列X(JSON格式)與第一鍵爲獨特的requestId:「ABC345」開始監聽到隊列Y表示響應
  3. 功能B出隊此消息並工作
  4. 功能B宿加
  5. 功能A與工作結果的消息進入隊列Y中的requestId:「ABC345」
  6. 功能A看到此消息的requestId:「ABC345」,並返回HTTP響應

我們怎樣才能函數的回暖只是它正在等待請求對於?

getMessage方法似乎並不能夠選擇性地收聽到一個隊列,只搶到頂消息:

getMessage(queue [, options], callback) 

這一換個角度是,如果我們想要多個工作職能聽隊列X.功能C將處理具有requestType:「query」的所有請求,而功能D將處理所有requestType:「blob」。沒有這個過濾,我們會爲每個Worker函數使用一個隊列。這是否也是正確的方式?

注意:我們使用的是node.js,但我假設Queue API在所有SDK中都是等價的。

回答

0

Azure隊列真的不會做請求 - 響應。 Http處理不應該在隊列中等待。 Http消息應該快速返回(同步,< 1分鐘),而隊列用於更長的異步後臺處理。如果Http在隊列中等待,它應該使用202長時間運行的模式。

考慮:使用

  1. 保持HTTP協議。您可以移植到函數並保留底層 模式。
  2. 在完全異步的情況下使用隊列。所以A排隊一個 消息啓動B並返回; A2收聽 B.
  3. 查看耐用功能預覽。這允許 同步調用完全像你想要的。它在預覽中,但 請參閱https://github.com/Azure/azure-functions-durable-extension
+0

謝謝這些細節。我的問題是關於如何在上面的列表中完成#2。我們希望做的事情在持久函數模式#1(鏈接)中進行了描述,但每個步驟都單獨運行在100ms或更短的時間內,希望我們可以在1-2秒內以端到端的方式返回響應,這很好在我們可接受的閾值內 – Graham

+0

如果一切都是1-2秒,你可以堅持使用HTTP嗎?卸載到隊列不會爲你買東西。 –

+0

除Microsoft不建議使用HTTP從其他函數調用函數。看起來他們正在爲我們弄清楚這一點,但還沒有完成。 – Graham