簡體   English   中英

當我從外部 api 獲取數據時,如何將數據返回給客戶端?

[英]How to return data to client as I get it from an external api?

我有一個應用程序,我在節點中有一個后端。 假設有一個 API 端點 (/get_menu) 來獲取所有菜單。
當應用程序調用 /get_menu 時,我會調用不同餐廳的外部 API,當它們都返回菜單時,我將其發送到應用程序。 我為此使用了 Promise.all。

由於一些餐廳需要花費大量時間,因此我想將數據返回給應用程序,因為我不斷從餐廳 API 獲取數據。 例如,如果他們中的兩個立即返回他們的菜單,那么我將這兩個返回給應用程序,然后隨着我不斷獲取其他 API 的數據,我不斷將其發送到應用程序。

使用單個 API 端點(即 /get_menu )有哪些好方法?

有幾個解決方案

  1. 為了給你一個字面意思的答案,你可以使用 socket 的一些實現,比如 socket.io,隨時向你的客戶端發送數據。

  2. 第二種選擇是將餐廳的菜單保存在數據庫中,並從那里為用戶提供服務。 在后台,定期使用 cron 更新您的數據庫。 讓您的用戶等待直到您的所有菜單 API 都解決了,這並不是真正可取的。

我建議為此使用基於 redis 的隊列機制。 您可以將每個 API 作為此隊列中的作業推送。

有一個非常好的基於 redis 的隊列 npm 包Bull 當作業處理完成時,有一些事件需要通知。 作業完成后,您可以將數據發送回應用程序。

在使用 UUID(請求服務器獲取菜單列表的唯一 ID)的客戶端 javascript 上實現 Web Worker

然后服務器將創建一個數據庫條目,為各種遠程 api 請求分配一個唯一的 ID。 然后,node.js 立即將請求 ID 列表發送回客戶端並進行渲染。 獲取菜單的后台任務是單獨運行的,每次有結果時,它都存儲在數據庫中。 客戶端 Web Worker 將定期請求它需要的 UUID 列表,服務器將響應那些已響應的。 一旦發送到客戶端,數據就會被刪除,客戶端呈現結果並從其請求列表中更新該 uuid 以檢索數據......

它本質上是一個粗略的不可靠結果隊列,只要您的服務器可以跟上所有請求,它就可以安全運行。

另請參閱 Internet 上的“事件源”。

如果您的主機非常可靠,則更現代的版本涉及使用 websockets 和 websocket 服務器的類似實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM