全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c# gRPC 和 Web API 在高并发场景下的性能对比

gRPC 的 GrpcChannel 必须复用,否则性能断崖式下跌;正确做法是单例或 DI 注入,因其线程安全且底层共享 SocketsHttpHandler,与 HttpClient 复用规则一致。

gRPC 的 GrpcChannel 必须复用,否则性能断崖式下跌

很多刚上手 gRPC 的人会为每次调用都新建 GrpcChannel,这在高并发下直接拖垮吞吐——因为每个 GrpcChannel 默认建立并维护独立的 HTTP/2 连接池,频繁创建/销毁连接引发 TLS 握手、TCP 建连、流控初始化等开销。实测在 1000 QPS 下,每请求新建 channel 的吞吐可能不足复用时的 1/5。

正确做法是将 GrpcChannel 作为单例或注入到 DI 容器中长期持有:

services.AddSingleton(sp =>
    GrpcChannel.ForAddress("https://api.example.com", new GrpcChannelOptions
    {
        HttpHandler = new SocketsHttpHandler
        {
            PooledConnectionLifetime = TimeSpan.FromMinutes(5),
            KeepAlivePingDelay = TimeSpan.FromSeconds(60)
        }
    }));
  • GrpcChannel 是线程安全的,可被多线程并发使用
  • 避免在 Dispose() 后继续调用,否则抛出 ObjectDisposedException
  • 若服务地址动态变化(如多集群路由),需自行封装带刷新逻辑的 channel 工厂,而非简单 new

Web API 的 HttpClient 复用规则和 gRPC 完全一致

别以为 Web API 就“随便 new”,HttpClient 同样必须复用。反复 new HttpClient 会导致端口耗尽(TIME_WAIT 状态堆积)、DNS 缓存失效、SSL 会话复用失败等问题。它和 GrpcChannel 在底层共享 SocketsHttpHandler,行为高度一致。

常见错误写法:using var client = new HttpClient(); —— 这在高并发循环中等于自毁。

  • 推荐注册为 AddHttpClient(),由 DI 管理生命周期
  • 手动管理时,用静态只读字段或 Lazy 初始化一次
  • 不要通过 client.DefaultRequestHeaders 动态设 token 等请求级头——应改用 HttpRequestMessage 实例设置,避免并发写冲突

序列化开销:Protobuf vs JSON 是真实瓶颈点

gRPC 默认用 Protobuf,Web API 默认用 System.Text.Json(.NET 6+)。在同等数据结构下,Protobuf 序列化/反序列化耗时通常只有 JSON 的 30%~50%,体积压缩率常达 60% 以上。这对高频小包场景(如微服务间状态同步)影响显著。

但注意:如果你的 payload 主要是大文本(如日志行、HTML 片段),JSON 的字符串直通优势可能抵消 Protobuf 的二进制优势;而 Protobuf 要求提前定义 .proto 文件、生成类型,开发链路更重。

  • Web API 也可接入 Protobuf:用 AddControllers().AddProtobufFormatters(),但需客户端配合发送 application/x-protobuf
  • gRPC 不支持直接返回纯 HTML 或动态 JSON 字段(如 Dictionary),必须强类型
  • 调试时 Protobuf 二进制不可读,需依赖 grpcurl 或 Wireshark 解码,排查成本略高

HTTP/2 多路复用不是万能的,流控和超时配置不当照样卡死

gRPC 依赖 HTTP/2 的多路复用提升并发能力,但这不意味着“无限并发”。服务器端的 MaxStreamsPerConnection(Kestrel 默认 100)、客户端的 MaxOutboundStreamsPerConnection、以及流控窗口(InitialStreamWindowSize)都会成为瓶颈。当大量短生命周期流(如毫秒级 RPC)密集发起,可能触发流控阻塞,表现为你看到大量请求 hang 在 await call.ResponseAsync

典型症状:CPU 不高、连接数稳定,但 p99 延迟陡增、部分请求超时。

  • Kestrel 中调大流上限:options.Limits.Http2.MaxStreamsPerConnection = 1000;
  • 客户端降低初始窗口以减少内存占用(尤其小消息):new GrpcChannelOptions { MaxReceiveMessageSize = 4 * 1024 * 1024 }
  • 务必设置 CallOptions.Timeout,否则默认无超时,失败请求会长时间占住 stream
  • Web API 的 HTTP/2 行为受相同底层限制,但因无 stream 概念,压力更多落在连接数和线程池上

实际压测中,gRPC 在 5k+ QPS、平均 payload 浏览器直连),Web API 的灵活性和可观测性优势立刻凸显。选型时别只盯数字,先看你的团队是否愿意为 Protobuf 合约管理和二进制调试多花 20% 时间。


# html  # js  # json  # windows  # 浏览器  # app  # 端口  # ssl  # curl  # ai  # 路由  # win  # dns  # String  # Object  # 封装  # Token  # 字符串  # 循环  # 数据结构  #   # using  # 线程  # 多线程  # var  # 并发  # channel  # http  # wireshark  # rpc  # 复用  # 客户端  # 序列化  # 这在  # 多路  # 的人  # 连接数  # 为你  # 也可 


相关文章: 建站主机选虚拟主机还是云服务器更好?  javascript中对象的定义、使用以及对象和原型链操作小结  英语简历制作免费网站推荐,如何将简历翻译成英文?  香港服务器部署网站为何提示未备案?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  网站制作的步骤包括,正确网址格式怎么写?  内部网站制作流程,如何建立公司内部网站?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  建站之星导航如何优化提升用户体验?  网站制作员失业,怎样查看自己网站的注册者?  ,巨量百应是干嘛的?  建站主机选择指南:服务器配置与SEO优化实战技巧  ,sp开头的版面叫什么?  制作网站的公司有哪些,做一个公司网站要多少钱?  安徽网站建设与外贸建站服务专业定制方案  外贸公司网站制作哪家好,maersk船公司官网?  如何高效生成建站之星成品网站源码?  大连 网站制作,大连天途有线官网?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  如何快速搭建个人网站并优化SEO?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  制作营销网站公司,淘特是干什么用的?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  制作证书网站有哪些,全国城建培训中心证书查询官网?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何通过VPS搭建网站快速盈利?  Swift中循环语句中的转移语句 break 和 continue  如何快速搭建高效WAP手机网站吸引移动用户?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  建站之星安全性能如何?防护体系能否抵御黑客入侵?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  如何选择适配移动端的WAP自助建站平台?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  建站之星logo尺寸如何设置最合适?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何用AWS免费套餐快速搭建高效网站?  如何在IIS中新建站点并配置端口与物理路径?  定制建站哪家更专业可靠?推荐榜单揭晓  建站之星代理商如何保障技术支持与售后服务?  建站主机数据库如何配置才能提升网站性能?  如何高效搭建专业期货交易平台网站?  建站之星后台密码遗忘?如何快速找回? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。