【问题标题】:Using a single HTTP/2 connection for bidirectional (and symmetric) communication使用单个 HTTP/2 连接进行双向(和对称)通信
【发布时间】:2016-03-05 17:55:47
【问题描述】:

HTTP/2 引入了一些非常有趣的特性,例如流水线、多路复用和服务器推送承诺;这本身就很棒。 作为回报,我们牺牲了 WebSockets。

理论上 HTTP/2 允许服务器和客户端之间以推送承诺的形式进行双向通信。服务器甚至可以在被请求之前向客户端发送响应。再次;惊人的。 这些请求与客户的请求不同。

所以手头的问题:
有没有一种方法可以拥有一个单一 HTTP/2 连接,允许服务器和客户端相互发送任意消息(二进制消息的额外点),而无需为 定义不同的协议客户端发送消息服务器发送消息

WebSockets 是我正在寻找的一个很好的例子,因为任何一方都可以启动连接,然后双方都可以发送消息。

不破坏 HTTP/2 的解决方案是理想的,但也欢迎滥用协议。
非常感谢您。

ps。本练习的目的是确定是否可以在 HTTP/2 之上设计 GRPC、Thrift 等传输协议,而无需服务器/客户端架构,但双方都可以发送和接收消息,因此诸如 req 之类的功能/resp、pub/sub、rpc 等可以在其之上构建。

【问题讨论】:

  • grpc 默认使用 http2。 grpc.io/docs/guides/wire.html
  • @nibin012 afaik 服务器无法发起 gRPC 请求-回复交换,只有客户端可以,不是吗?

标签: architecture network-protocols http2


【解决方案1】:

现在最接近您想要的是服务器发送的事件。它应该可以很好地与 HTTP/2 一起工作,并且除了习惯性的 IE 之外,所有浏览器都支持它,但是有一个 polyfill 可用(它会吃掉你的 RAM)。但是,没有某种转义就没有二进制支持,因为换行符用于分隔消息部分和消息本身。

还有几点说明(欢迎指正):

  • Websockets 非常好用。 HTTP/2 Connect 应该可以在不久的将来为此提供服务,如果不是现在的话。
  • 但服务器无法启动到客户端的 websocket。
  • 推送承诺的用途非常不同,不,您不能使用它们代替 websocket。

HTTP/2 推送称为推送,但它与从服务器推送的通知无关。这只是通过节省往返次数来减少应用程序加载时间的一种或多或少的明智方法。

【讨论】:

  • 服务器端事件似乎确实是我问题的最合适的答案。一个非常有趣的 golang 示例可以在这里找到new-bamboo.co.uk/blog/2014/05/13/…
  • 感谢您分享出色的信息。我对 HTTP2 推送也有同样的困惑。
  • 那么是否需要围绕 HTTP/2 全双工构建一个框架来模拟 WebSockets?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 2021-08-31
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
相关资源
最近更新 更多