V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mitu9527
V2EX  ›  程序员

HTTP 2.0 对内网服务之间的通信是不是没啥帮助?

  •  2
     
  •   mitu9527 · 2022-09-25 19:45:52 +08:00 · 3471 次点击
    这是一个创建于 549 天前的主题,其中的信息可能已经有所发展或是发生改变。

    感觉 HTTP 2.0 的 header 压缩还能多少有些作用,但恐怕作用不大,因为服务器和服务器间通信时 header 数量不多。而多路复用、二进制分帧好像对内网服务器之间的通信不但没帮助,还会负优化。服务器推送貌似在客户端和服务器通信时比较有用,服务器和服务器通信时基本上用不到。

    综上所述,有两个猜测:

    1. HTTP 2.0 对内网服务器之间的通信是不是真没啥太大帮助?
    2. 基于 1, 微服务使用 gRPC (使用 HTTP 2.0 作为通信协议,使用 protobuf 作为数据交换格式)通信时,真正能提升效率的是 protobuf ?那感觉 gRPC 也不会比传统的 HTTP 1.1 + JSON 快多少啊。

    上面两个猜测是对的么?还是我漏掉了什么,求解惑。

    36 条回复    2022-09-27 13:22:25 +08:00
    aaronlam
        1
    aaronlam  
       2022-09-25 19:51:44 +08:00
    而多路复用、二进制分帧好像对内网服务器之间的通信不但没帮助,还会负优化。服务器推送貌似在客户端和服务器通信时比较有用,服务器和服务器通信时基本上用不到。

    想问下,以上这个观点是怎么得出来的?
    mitu9527
        2
    mitu9527  
    OP
       2022-09-25 19:58:19 +08:00
    HTTP 1.x 浏览器和服务器通信时会使用 N 个连接发送 M 个请求的情况,N 一般最大为 8 ,M 一般都是几十甚至几百,而服务器和服务器通信时好像不存在这种情况,都是 1 比 1 的,TCP 连接内就算同步阻塞读写也没问题;另外内网服务器之间的网络延迟一般都是 1ms 以内,而浏览器和服务器之间的网络延迟一般都在 20-30ms 之间。
    mitu9527
        3
    mitu9527  
    OP
       2022-09-25 20:00:40 +08:00
    @aaronlam HTTP 1.x 浏览器和服务器通信时会使用 N 个连接发送 M 个请求的情况,N 一般最大为 8 ,M 一般都是几十甚至几百,而服务器和服务器通信时好像不存在这种情况,都是 1 比 1 的,TCP 连接内就算同步阻塞读写也没问题。问题不存在,所以解决方案就是多余的,多做的工作就是负优化。我是这么理解的哈。
    wanguorui123
        4
    wanguorui123  
       2022-09-25 20:18:40 +08:00
    本地确实提升不大
    sam384sp4
        5
    sam384sp4  
       2022-09-25 20:20:55 +08:00
    http 2.0 的 tls 貌似是必须的
    mitu9527
        6
    mitu9527  
    OP
       2022-09-25 20:25:48 +08:00
    @sam384sp4 好像是在 tls 中加了一个 ALPN ,用来判断是否支持 HTTP 2.0 ,不在 tls 中做的话就得在客户端和服务器之间多通信一次,这违背了 HTTP 2.0 的初衷。浏览器和客户端之间应该必须是要用 https 的,服务器和服务器之间应该可以不用,好像不是强制的。
    guyeu
        7
    guyeu  
       2022-09-25 20:50:04 +08:00
    服务器内网通信的瓶颈从来不在网络协议上,gRPC 选型使用 HTTP/2 肯定有谷歌自己的倾向在,不过既然是 HTTP 了,选用当时最新的版本好像也没什么毛病。
    不知道负优化是咋得出的结论,仅就多路复用一条就很重要呀,想想一个长时间执行的任务需要客户端等待结果,HTTP/1 的话只能新建一个连接,HTTP/2 就可以在同一个连接上用别的 stream 去处理。基于 HTTP/1 虽然也有办法做到这件事,HTTP/2 确实还是有点用的。
    mitu9527
        8
    mitu9527  
    OP
       2022-09-25 20:56:06 +08:00
    @guyeu HTTP 1.x 客户不是一条连接哈,可以多条。所以多任务时可以通过多连接实现,每个连接只一个请求和响应,就不存在多请求响应了,也就没必要多路复用了,从而二进制分帧也没用了。至于多连接的方式,一般都自带连接复用或者池化技术,所以也不存在频繁创建和销毁连接的情况。客户端和服务器通信时 HTTP 2.0 很有用,内网的服务器和服务器通信时 HTTP 2.0 感觉用处不大。
    guyeu
        9
    guyeu  
       2022-09-25 21:02:12 +08:00 via iPhone
    @mitu9527 同意你说的用处不大,但确实不是负优化。最起码可以省去在应用层实现一个连接池的成本哟
    mitu9527
        10
    mitu9527  
    OP
       2022-09-25 21:08:10 +08:00
    @guyeu 好像也不用我们实现,都自带甚至默认开启了 keep-alive 了。我刚才上网搜了一下,那些说提升巨大,比如有说将近 10 倍的,都是测得客户端到服务器端;在 github 上找到一个服务器端到服务器端的基准测试,提升不到 10%。我回头再去找找其他基准测试。
    aababc
        11
    aababc  
       2022-09-25 21:09:11 +08:00
    感觉是不是 HTTP3 才是大杀器?
    mitu9527
        12
    mitu9527  
    OP
       2022-09-25 21:11:32 +08:00
    @aababc 额,还没了解,让我去看看。
    ospider
        13
    ospider  
       2022-09-25 21:34:14 +08:00
    和楼主有一样的疑问好多年了,实在不理解在内网用 http2 图啥,为了 streaming response ?如果 Google 的意思是让 grpc 能在外网也用的话,那这个目标显然没有实现,没人会为了调用外部的 API 去搞 pb 这一套的……
    lysS
        14
    lysS  
       2022-09-25 21:58:22 +08:00
    @mitu9527 #3 你是想说 keepalive 吗?
    lysS
        15
    lysS  
       2022-09-25 21:59:45 +08:00
    grpc 比 json 肯定快不少,当然用 json 传输的都是小数据,表现可能不明显
    mitu9527
        16
    mitu9527  
    OP
       2022-09-25 22:19:12 +08:00
    @ospider
    个人认为内网服务器之间通信用 gPRC 的原因不是奔着 HTTP 2.0 去的,而是 protobuf 去的,服务器之间都是内部自己人,沟通成本低,所以可以直接通过 api 列表和 proto 文件。

    而客户端和服务器通信具体分两种情况:
    1. 如果服务器面向的客户端开发人员都是自己公司的人,这种叫 SSKD ,此时首先可以考虑使用 gRPC ;当然 HTTP + json 也是可以的(这时不见得会用 REST ),此时 HTTP 2.0 可以大显神威。
    2. 如果服务器面向的客户端开发人员是外部的人,这种叫 LSUD ,此时一般会考虑使用 HTTP + json + REST(虽然可选,但是这是往往会用),这时候 HTTP 2.0 就可以大显神威了。沟通成本高,所以对外要提供详细的 API 文档,如果用 gRPC 并且只提供 api 列表和 protobuf ,估计技术对接人员会忙死。
    mitu9527
        17
    mitu9527  
    OP
       2022-09-25 22:20:00 +08:00
    @lysS 嗯,HTTP 1.1 好像支持,而且默认就会开启来吧。
    mitu9527
        18
    mitu9527  
    OP
       2022-09-25 22:21:45 +08:00
    @lysS protobuf 比 json 小,且编解码快,这点没问题哈。不过我在讨论 HTTP 2.0 在内网通信时的作用大小哈。
    lslqtz
        19
    lslqtz  
       2022-09-25 22:58:10 +08:00
    聊胜于无吧, h2c 比 h2 好一点.
    Opportunity
        20
    Opportunity  
       2022-09-25 23:44:13 +08:00
    内网要用也是 h2c 吧,用 h2 算啥啊
    Reficul
        21
    Reficul  
       2022-09-25 23:52:45 +08:00
    会负优化,在整体只考虑 HTTP QPS 的压测情况下,因为协议复杂 + TLS 的原因,回避 HTTP 1 慢不止一倍。
    jim9606
        22
    jim9606  
       2022-09-26 00:35:30 +08:00
    内网通信应该主要想使用 HTTP2 的 stream multiplex ,HTTP1.1 即使使用 keep-alive 也依然存在队头阻塞( HOL Blocking )的问题,头压缩什么的应该不是主要目的,跟 Web 应用需要每个请求都重复传一堆头字段不一样,gRPC 没这个问题。

    另外 json 有一个缺陷是它是 schemaless+文本,除了编码要带上结构信息占据额外流量外还涉及大量字符串操作,会带来很大的 GC 压力。

    另外 protobuf 还有些我道听途说的问题,protobuf 理论上编码很高效,但 protoc 生成的代码实际性能不见得高,经常搞出一堆编译警告; google monorepo 模式带来的副作用——跨版本兼容性不佳,你有信心保证一个大型项目(可能还有外部合作方)里所有组件都依赖相同版本的 protobuf 吗?
    IvanLi127
        23
    IvanLi127  
       2022-09-26 08:16:43 +08:00 via Android
    @sam384sp4 h2c ,不需要 tls 。
    echo1937
        24
    echo1937  
       2022-09-26 08:45:53 +08:00
    现在没有浏览器支持 h2c ,postman 好像也没有支持 h2c 的,所以调试起来比较麻烦。

    另外就是有些前端,或者上游调用的客户端比较老的话,也不支持 h2c 。

    现在有没有同时支持 h2c 和 HTTP 1.1 ,并支持自动 upgrade 到 h2c 的实现方案啊?
    janxin
        25
    janxin  
       2022-09-26 08:55:12 +08:00
    你这么问应该是没用 mTLS...

    当然只考虑性能,自然还是抛弃 TLS 更好
    ZE3kr
        26
    ZE3kr  
       2022-09-26 09:11:47 +08:00 via iPhone
    对内网还是很有帮助的,对 localhost 没啥帮助
    julyclyde
        27
    julyclyde  
       2022-09-26 09:46:40 +08:00
    所谓负优化,很多时候其实体现在不方便 tcpdump 吧
    正常工作状态只是优化意义小,谈不上负
    oceanthe1h
        28
    oceanthe1h  
       2022-09-26 11:47:48 +08:00
    个人理解,对于 web 界面来说,H2 多路复用可以让多个小图片对用户呈现同步加载的效果,对于服务器的响应包来说,以字节流为单位的多路复用好像意义不大,服务器需要完整的响应包才能有效解析,如果以包为单位的多路复用,好像 NIO 的 channel 就能够实现在一条 TCP 连接作为逻辑连接,也没必要使用传输层的分帧
    darknoll
        29
    darknoll  
       2022-09-26 12:58:05 +08:00
    做个对比测试不行吗?上来就谈我感觉怎么样怎么样。
    mitu9527
        30
    mitu9527  
    OP
       2022-09-26 14:55:51 +08:00
    @darknoll 不做对比测试就不配发言了么?你都可以回复,为啥我不能发言?
    darknoll
        31
    darknoll  
       2022-09-26 14:59:30 +08:00   ❤️ 1
    @mitu9527 滚一边去吧
    mitu9527
        32
    mitu9527  
    OP
       2022-09-26 15:05:00 +08:00
    @darknoll 你要是看着不舒服,不回复关了就是了,整这么一出,什么人啊?
    julyclyde
        33
    julyclyde  
       2022-09-27 09:58:56 +08:00
    @mitu9527 人家在讨论学习方法,你却认为是人身攻击
    我只能说,差的人确实有差的原因
    mitu9527
        34
    mitu9527  
    OP
       2022-09-27 12:18:08 +08:00
    @julyclyde 我攻击他了么?如果所有的讨论都可以转化成自己测试和研究,以后别提问题也别说话了?你能做到么?
    julyclyde
        35
    julyclyde  
       2022-09-27 12:20:33 +08:00
    @mitu9527 你没攻击啊。你是把别人的劝告当成攻击,然后反应过激
    你现在都已经过激到连我说(你认为他攻击)还是说(你攻击)都分不清的地步了
    mitu9527
        36
    mitu9527  
    OP
       2022-09-27 13:22:25 +08:00
    @julyclyde 差的人确实有差的原因,这叫劝告?你平时上来就和陌生人这么说话?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5317 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:34 · PVG 17:34 · LAX 02:34 · JFK 05:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.