2016-10-10 41 views
0

我正在構建一個需要很長時間才能返回數據的API,在進行轉換時最多需要60秒。在運行時,我想讓用戶知道任何錯誤,並通知他們在我們所處的轉換階段中的哪個進程。替代「通知URL」來處理節點中長時間運行的API進程

這在客戶端很容易,因爲我可以簡單地發送一個WebSocket事件,但是對於一個公共API,這不是很實用。

我知道我可以請求通知URL並將更新發送到給定的URL,但它看起來很麻煩並且可能會佔用大量資源。是否有另一種更有效的方式發送進度通知?

理想情況下,使用API​​的用戶可以設置。

.on("error", function(err) { //handle error });

或諸如此類的話。

+0

因此,您既不想通過套接字來推送通知,也不想一個具有最後已知狀態的RESTful URL?你覺得這個工作如何? – Paul

+0

您可以立即使用某個標識符(uuid或其他)爲長時間運行的進程做出響應,然後客戶端可以每隔5秒(或您希望的任何時間間隔)對包含該標識符的GET請求進行輪詢。然後您可以對這些後續請求和當前進程狀態做出響應。 – idbehold

+0

@Paul Socket對我的知識不起作用,因爲未知客戶端需要知道連接到套接字的位置。儘管有可能我不知道我在說什麼。 RESTful URL的作品,但似乎效率低下,煩人的用戶執行。我現在在那裏,發現它實施和使用令人討厭。 –

回答

1

你不清楚你的API使用者是誰,他們使用的是什麼類型的客戶端,或者工作流將是什麼樣的。所以有很多不同的答案取決於你在找什麼和你有什麼資源。

的非詳盡列表:

REST端點輪詢

明白了,你是不是球迷,但是這仍然是做了廣泛的客戶的最佳途徑之一,是僅有的兩種(我知道的)爲純粹基於瀏覽器的客戶端做的方法之一。在性能方面,如果您正確設置緩存策略併爲您的客戶設置節流限制(無論如何您應該這樣做),這並不糟糕。我不同意這是PITA爲客戶使用消費,但這是意見,你顯然感覺不同。緩解PITA的一個方法是提供一個SDK來處理消費者的這種機制。

網絡套接字

我得到,你可能會和誰打交道都不會在網上出發的客戶,但如果客戶端可以讓一個RESTful請求,您可以設置服務器做網頁套接字升級,如果客戶通告建立相同的興趣。我不是這個選項的粉絲,因爲它對我來說感覺更復雜(更多運動部件),但是如果你喜歡網絡套接字,並且所有/大多數客戶端都具有網絡套接字功能,那麼這是一個選項。或者您可以將REST響應作爲您爲該客戶端打開的Web套接字的URL。

網絡掛接

如果你的客戶很可能是其他機器(尤其是服務器),那麼網絡掛鉤是一個非常好的做法,特別是如果你想提高可能發生一次以上的情況下並在不可預知的時間間隔。在這個方案中,客戶端向你發送一個REST請求,他們發送給你的數據的一部分包括一個URL,你將在事件發生時將數據發送到(以你在API中指定的格式)。顯然,他們必須將該URL保留爲開放給你的POST,否則你可以同意你的服務器會尊重某種證書。

TCP套接字

到Web Socket選項設置類似的,就是你可能有一個REST請求打你的終點,然後與插座連接信息/ URI到自定義的TCP套接字迴應。這有點不標準,但在正確的用例中可能非常有用和高效。我有一段時間沒有使用它,所以他們可能已經改變了它,但這是Heroku的API用於處理流日誌的方式。

發佈/訂閱或消息隊列或類似

Redis的能做到這一點,如許多其他。在這種情況下,您正在制定一個更通用的解決方案,其中可能有多個事件通道客戶端可以訂閱,等等。我不喜歡直接出於安全原因暴露Redis,這意味着您仍然需要弄清楚如何處理Redis和客戶端之間的通信(請參閱上文),但在引擎蓋下使用它至少會爲您提供一些概念邏輯處理髮布者和訂閱者等問題;正如我所說的,如果您有多個事件,那就很有用。雖然這是一個比上面更重的解決方案,並且會增加您的系統管理員開銷(取決於您的高可用性需求等)

+0

網頁掛鉤!從來沒有想到這一點!非常感謝。 –