首頁 >後端開發 >Golang >收到另一個請求後提供 HTTP 請求的回應

收到另一個請求後提供 HTTP 請求的回應

PHPz
PHPz轉載
2024-02-09 13:06:181225瀏覽

收到另一个请求后提供 HTTP 请求的响应

php小編草莓在開發Web應用程式時,我們經常需要處理HTTP請求並提供相應的回應。當我們收到一個請求時,我們需要根據請求的內容和目的,產生適當的回應。這可能涉及查詢資料庫、處理表單資料、呼叫其他API等各種操作。在本文中,我們將探討如何在PHP中處理HTTP請求並提供相應的回應,以便為使用者提供更好的互動和使用者體驗。無論是建立一個簡單的靜態網頁還是一個複雜的Web應用程序,了解如何處理HTTP請求和產生回應都是非常重要的。

問題內容

我的用例是在從單獨的伺服器接收到另一個請求後提供 HTTP 請求的回應。

  1. 我希望以盡可能最好的方式做到這一點,同時牢記擴展性。
  2. 我們使用 Golang 1.19 和 Gin 框架。
  3. 伺服器將有多個 Pod,因此通道將無法運作。
  4. 所有請求都會逾時,初始請求將在 60 秒後逾時。

我目前的解決方案是使用共享緩存,其中每個 Pod 都會不斷檢查緩存。我相信,我可以透過通道來優化這一點,系統定期檢查任何已完成的回應,而不是逐一檢查快取。

我還想知道如何用其他程式語言實現它。

PS:這是基於設計的查詢,我在這裡有一些分享賞金的聲譽,因此在這裡詢問。如果問題不清楚,請隨時編輯。

解決方法

tl;博士

問題描述

因此,假設您的伺服器應用程式名稱為 server_app,例如有 3 個 pod:

+---------------------+
     |  server_app_service |
     +---------------------+
     |  server_app_pod_a   |
     |  server_app_pod_b   |
     |  server_app_pod_c   |
     +---------------------+

您的服務收到一個名為 "request a" 的請求,並決定將其傳遞給 server_app_pod_a。現在,您的 server_app_pod_a 將請求轉送到某個網關,並等待某種通知,以繼續處理客戶端的回應。如您所知,無法保證當網關執行 request b 時,服務會再次將其傳遞給 server_app_pod_a。即使這樣做,應用程式的狀態管理也將成為一項艱鉅的任務。

訊息傳遞

正如您可能已經注意到的,我在上一段中將“通知”一詞加粗,這是因為如果您認真考慮一下,request“b”看起來更像是帶有一些訊息的通知 而不是對某些資源的請求。所以我的第一個選擇是像 kafka 這樣的訊息隊列(如你所知,有很多這樣的訊息隊列)。這個想法是,如果您可以定義演算法來計算請求的唯一鍵,那麼您就可以在完全相同的 pod 中收到結果通知。這樣,狀態管理會更簡單,在同一個 pod 中獲得通知的機會也會更高(當然這取決於許多因素,例如訊息佇列的狀態)。看看您的問題:

  1. 我希望以盡可能最好的方式做到這一點,同時牢記擴展性。

當然,您可以像 kafka 一樣使用這些訊息佇列,以實現訊息佇列和應用程式的擴展並減少資料遺失。

  1. 所有請求都會逾時,初始請求將在 60 秒後逾時。

這取決於您如何管理程式碼庫中的逾時,使用上下文是一個好主意。

我還想知道如何用其他程式語言實現它。

使用訊息佇列是一個通用的想法,它適用於幾乎任何程式語言,但根據語言的程式設計範例以及特定於語言的程式庫和工具,可能還有其他一些方法來解決此問題。例如在scala 中,如果您使用一些名為akka 的特定工具(它提供了actor 模型程式設計範例),您可以使用所謂的akka-cluster-sharding 來處理這個問題。這個想法非常簡單,我們知道必須有某種監督者,它知道自己的訂閱者的確切位置和狀態。因此,當它收到一些訊息時,它只知道將請求轉發到何處以及哪個參與者(我們正在討論參與者模型程式設計)。換句話說,它可用於在叢集上產生的參與者之間共享狀態,無論是否在同一台機器上。但作為個人偏好,我不會選擇特定語言的交流,而是堅持一般的想法,因為這可能會在未來引起問題。

總結

足夠長的解釋:)。為了理解我所說的內容,讓我們追蹤完全相同的場景,但通訊模型有所不同:

  1. 客戶端向 server_app 服務發送請求「a」。
  2. 服務選擇其中一個 pod(例如 server_app_pod_b)來處理請求。
  3. 然後,pod 嘗試為請求定義一些金鑰,並將其與請求一起傳遞到網關,並等待帶有該金鑰的訊息在佇列中發布。
  4. 網關執行其應有的操作,並使用金鑰傳送訊息到訊息佇列。
  5. 完全相同的 pod serer_app_pod_b 接收帶有金鑰的訊息,取得訊息的數據,並繼續處理客戶端的請求。

可能還有其他方法可以解決這個問題,但這就是我想要的。希望對您有幫助!

以上是收到另一個請求後提供 HTTP 請求的回應的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除