簡體   English   中英

延遲節點中傳入HTTP請求的處理

[英]Defer handling of incoming HTTP requests in Node

我故意將其保持在較高的水平,因為我懷疑這里缺少一些基本概念。

我正在運行節點/ Express服務器。 我希望該服務器有效地起到節流閥的作用,因此我想存儲(在內存或其他進程(如Redis)中) 傳入的 HTTP請求,以便稍后處理(使用response.end())。 這可能嗎?

這可能嗎?

不需要。您可以在任意位置存儲有關請求的狀態/信息,但是請求本身將基本上綁定到某個文件描述符,該文件描述符與處理該請求的實際打開套接字相關聯,並且實際上沒有辦法進行移動。

這可能嗎?

是的,但有一些限制。

首先,如果您不打算更改發出請求的客戶端的設計,則必須在HTTP連接進入的套接字上進行響應。 HTTP連接是從客戶端到服務器的實時套接字連接。 響應必須在該套接字上發送。 這意味着,如果要在響應之前等待一會兒,則必須使該套接字保持活動狀態,並找到一種方法來在套接字達到超時並放棄等待響應之前進行響應。 瀏覽器都將設置某種客戶端超時設置,如果它們在該時間內沒有收到響應,它們將關閉套接字並假定請求未成功。 您可能需要在比此超時時間更短的時間內做出響應,或者您必須通過緩慢地滴加某種形式的響應來強迫客戶端延長超時時間,以使客戶端認為數據即將到來(我沒有我自己嘗試過)。

僅供參考,傳入的連接不能“存儲”在另一個進程或磁盤中。 您將必須在節點/快速服務器中跟蹤它們。


如果您可以更改客戶端的設計,那么您可以做各種各樣的事情。 例如,客戶端可以發出請求,並且它立即獲得的響應可以是唯一的ID和時間值。 這告訴客戶端其響應已“推遲”到以后。 同時,服務器存儲該請求,並且在計划的延遲時間之前的某個時間,它可以計算該響應。 然后,當客戶端再次簽回並要求提供特定唯一ID的響應時,服務器可以返回該響應。


如果您可以使用socket.io(甚至是普通的webSocket)連接,則可以輕松一點。 由於基於WebSocket的連接是持久的,因此客戶端可以發出請求,然后在服務器感到滿意后的某個時候,它將響應發送到該客戶端的webSocket連接。

暫無
暫無

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

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