使用单个HTTP/2连接进行双向(对称)通信

14

HTTP/2引入了一些很有趣的功能,如流水线处理、多路复用和服务器推送承诺,它们本身非常棒。 然而,我们放弃了WebSockets。

理论上,HTTP/2允许服务器和客户端之间以推送承诺的形式进行双向通信。服务器可以在被请求之前向客户端发送响应。同样,这也很棒。 然而,这些请求与客户端的请求不同。

所以问题来了:
有没有一种方法,可以使用单个HTTP/2连接,让服务器和客户端彼此发送任意消息(二进制消息额外加分),而无需为客户端发送的消息服务器发送的消息定义不同的协议?

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

最好的解决方案是不破坏HTTP/2的情况下实现,但协议滥用也是可以接受的。
非常感谢您的帮助。

ps. 这个练习的目的是弄清楚是否可以在HTTP/2的基础上设计像GRPC、Thrift等传输协议,而不需要服务器/客户端架构,但双方都能发送和接收消息,以便构建如请求/响应、发布/订阅、RPC等功能。


1
grpc默认使用http2。http://www.grpc.io/docs/guides/wire.html - nibin012
据我所知,服务器无法启动gRPC请求-响应交换,只有客户端可以,对吗? - user7610
1个回答

9

目前最接近你想要的东西是服务器发送事件。它应该可以很好地与HTTP/2配合使用,并且除了老旧的IE浏览器外,所有浏览器都支持它,但是有一个polyfill(会占用你的RAM)。但是没有二进制支持,因为换行符用于分隔消息部分和消息本身。

一些注意事项(欢迎更正):

  • WebSocket非常流行。HTTP/2连接在不久的将来应该可以用于它,如果现在还不能,也是可以服务的。
  • 但是服务器无法向客户端启动WebSocket。
  • Push Promise的目的完全不同,不能代替WebSocket使用。

HTTP/2推送被称为push,但它与从服务器推送的通知没有关系。这只是一种更或多或少减少应用程序加载时间的合理方式,通过节省往返时间。


服务器端事件似乎是我问题的最合适答案。这里可以找到一个非常有趣的golang示例:https://www.new-bamboo.co.uk/blog/2014/05/13/writing-a-server-sent-events-server-in-go/ - George Antoniadis
感谢分享优秀的信息。我之前对HTTP2推送也有同样的疑惑。 - lithiumlab
那么是否有必要围绕HTTP/2全双工建立一个框架来模拟WebSockets呢? - FrickeFresh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接