在 HTTP 请求/响应场景中,我想响应请求的客户端并不重要(无论如何他会怎么说)。
简而言之,我想从这里开始:
Client
↓ ↑
Nginx
↓ ↑
ServerA
↓ ↑
ServerB
为此:
Client
↓ ↑
Nginx ↖
↓ ↖
ServerA ↖
↓ ↗
ServerB
由于serverB已经有了响应,不会做额外的处理,我想绕过serverA,但如果可能的话应该通过nginx(例如使用压缩)。
具体来说,我想了解更多:
必要的nginx配置(如果有的话)
serverA和ServerB之间的协议(protocol)交换是否必须特殊?
为此发生必须传递的上下文?另外,如果他们使用不同的语言(在我的例子中是 Clojure 和 Scala)会怎样。
非常欢迎一个小示例(最好是 Clojure、Scala、Java、Node.js - 任何可读的语言)。
最佳答案
我确定您的案例可以通过 nginx-clojure 实现.去年有人用 nginx-clojure 做了类似但更复杂的事情。并且serverA和ServerB之间的协议(protocol)交换没有任何关系。
- 在 nginx 内容处理程序中,使用
hijack!
获取 NginxHttpServerChannel saych
,将ch
放入映射中,键为req-uuid
.所以我们可以使用ch
稍后发送响应数据。向ServerA发送nginx url、req-uuid等数据。 - ServerA向ServerB发送
nginx-url
、req-uuid
等数据。 - ServerB发送
req-uuid
并通过另一个不同于第一步的url响应nginx,例如'/asynNotfifyHandler' - 编写另一个 nginx 内容处理程序来接收 ServerB 对位置“/asynNotfifyHandler”的响应。如果 nginx 工作进程只有一个,则在此处理程序中获取 NginxHttpServerChannel
ch
并使用它来发送响应。如果我们有多个 nginx worker 进程,我们需要使用broadcast!
来广播 repsonse 事件,并使用on-broadcast!
来获取持有 nginx worker 进程中的响应事件NginxHttpServerChannelch
并使用它向原始客户端发送响应。
Here是一个关于 channel sub/pub 的例子。
顺便说一句,我们也可以使用 redis 的 sub/pub 而不是 broadcast!
和 on-broadcast!
来自 nginx-clojure。例如在第一个内容处理程序中,我们将 redis 的主题子化,然后服务器 B 将响应消息发布到相同的 redis 主题。最后使用 NginxHttpServerChannel ch
将响应发送给原始客户端。
关于scala - 来自不同服务器的 HTTP 请求/响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31951813/