![](/img/trans.png)
[英]Play framework make http request from play server to “somesite.com” and send the response back to the browser
[英]HTTP request / response with response from a different server
在HTTP請求/響應方案中,我猜對響應請求的客戶端來說無關緊要(無論如何,他會如何說)。
簡而言之,我想從這里開始:
Client
↓ ↑
Nginx
↓ ↑
ServerA
↓ ↑
ServerB
對此:
Client
↓ ↑
Nginx ↖
↓ ↖
ServerA ↖
↓ ↗
ServerB
由於serverB已經有響應,並且不會進行其他處理,因此我想繞過serverA,但是如果可能的話,應該通過nginx(例如使用壓縮)。
具體來說,我想進一步了解:
必要的nginx配置(如果有)
serverA和ServerB之間的協議交換是否必須特殊?
要發生這種情況必須傳遞的上下文? 此外,如果他們使用不同的語言(在我的情況下為Clojure和Scala),會發生什么。
一個小示例示例將是非常受歡迎的(最好是Clojure,Scala,Java,Node.js-只要可讀的任何語言)。
我確定您的案例可以使用nginx-clojure實現 。 去年,有人用nginx-clojure做過類似但更復雜的事情。 與serverA和ServerB之間的協議交換無關。
hijack!
要獲取NginxHttpServerChannel的ch
,將ch
放入帶有密鑰的地圖req-uuid
。 因此,我們可以稍后使用ch
發送響應數據。 將nginx url,req-uuid和其他數據發送到ServerA。 nginx-url
, req-uuid
和其他數據發送到ServerB。 req-uuid
和響應給nginx,例如'/ asynNotfifyHandler' ch
並使用它發送響應。 如果我們有多個nginx worker進程,我們需要使用broadcast!
播放回復事件並使用on-broadcast!
在擁有NginxHttpServerChannel ch
的Nginx工作進程中獲取響應事件,並使用該事件將響應發送到原始客戶端。 這是有關channel sub / pub的示例。
順便說一句,我們也可以使用redis的sub / pub代替broadcast!
和on-broadcast!
來自nginx-clojure。 例如,在第一個內容處理程序中,我們為redis主題創建了子主題,然后服務器B將響應消息發布到redis的同一主題。 最后,使用NginxHttpServerChannel ch
將響應發送到原始客戶端。
在HTTP請求/響應的情況下,我唯一能看到的就是通過某些HTTP服務器推送。 問題是,您至少將使用TCP連接進行客戶端/ Nignx通信。 我猜,您可以使用“即發即棄”的某些技術來做到這一點,但是您將需要能夠打開與客戶端的新連接以向其發送新數據。
在第一種情況下,每項服務都通過詢問請求並等待響應進行通信。
在第二種情況下,您可以做一些代理請求(不等待任何響應),但是要提供一些有關客戶端的信息,以便能夠在服務器B內與它聯系(打開連接)。
我不知道哪種技術最適合此用途,但這就是我要采取的方向。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.