
1) 【一句话结论】在投放系统的实时通信模块,选择gRPC是因为其基于HTTP/2的连接复用特性与Protocol Buffers二进制序列化,相比HTTP/1.1的短连接和HTTP/2的文本传输,能显著提升高并发下的QPS与响应延迟,更适配低延迟、高吞吐的实时业务需求。
2) 【原理/概念讲解】老师解释,gRPC是Google开发的RPC框架,底层基于HTTP/2,使用Protocol Buffers定义服务接口(.proto文件),序列化数据为二进制格式。HTTP/1.1是文本协议,每次请求需新建TCP连接,传输JSON等文本数据;HTTP/2支持多路复用,但传输的仍是文本(如JSON),序列化开销大。类比:gRPC像用二进制代码传输数据(高效、快速),HTTP/1.1像用文字信件传递(每次写信都要重新寄,效率低),HTTP/2像用多路电话线同时传文字(虽能同时,但文字本身解析慢,不如二进制快)。关键点:二进制序列化(Protocol Buffers)比文本(JSON/XML)更紧凑,解析更快;连接复用(HTTP/2的流控制)减少连接建立开销,适合高频请求。
3) 【对比与适用场景】
| 特性 | gRPC | HTTP/1.1 | HTTP/2 |
|---|---|---|---|
| 定义 | 基于HTTP/2的RPC框架,Protocol Buffers序列化 | 文本协议,每次请求新连接 | HTTP/1.1的升级,支持多路复用 |
| 序列化 | 二进制(Protocol Buffers),字段级编码 | 文本(JSON/XML),键值对 | 文本(JSON/XML),支持多路复用 |
| 连接复用 | 天然支持,客户端复用连接 | 需频繁建立/关闭连接 | 支持,但传输文本 |
| 延迟 | 低(二进制+连接复用) | 高(短连接开销) | 中(多路复用但文本开销) |
| 适用场景 | 实时竞价、消息推送、高并发RPC调用 | 简单、低并发、兼容旧客户端 | 需多路复用但文本传输的,如Web页面 |
| 注意点 | 需proto文件定义接口,编译生成代码 | 连接短,需处理连接建立开销 | 头部压缩(HPACK),但文本序列化慢 |
4) 【示例】
伪代码示例(服务定义与请求):
// 投放系统的实时竞价服务
syntax = "proto3";
package bidding;
service BiddingService {
// 获取竞价结果
rpc GetBid (BidRequest) returns (BidResponse) {}
}
// 请求消息
message BidRequest {
string ad_id = 1;
int32 user_id = 2;
string device = 3;
}
// 响应消息
message BidResponse {
int32 bid_price = 1;
string ad_url = 2;
string ad_content = 3;
}
客户端调用示例(gRPC Java客户端):
BiddingServiceGrpc.BiddingServiceBlockingStub stub = BiddingServiceGrpc.newBlockingStub(channel);
BidResponse response = stub.getBid(BidRequest.newBuilder()
.setAdId("ad_123")
.setUserId(1001)
.setDevice("mobile")
.build());
System.out.println("Bid price: " + response.getBidPrice());
5) 【面试口播版答案】
面试官您好,在投放系统的实时通信模块,选择gRPC主要基于性能优势。首先,gRPC采用Protocol Buffers二进制序列化,比HTTP/1.1的JSON文本更紧凑,解析速度快,减少了数据传输量。其次,gRPC天然支持HTTP/2的连接复用,客户端与服务器建立一次TCP连接后,可复用该连接发送多个请求,避免了HTTP/1.1中频繁建立/关闭连接的开销,在高并发下显著降低延迟。而HTTP/2虽支持多路复用,但传输的是文本数据,序列化开销大,且连接建立后仍需处理文本解析,导致在高并发场景下QPS和响应延迟不如gRPC。对于投放系统的实时竞价、消息推送等场景,需要毫秒级的低延迟和高吞吐,gRPC的这些特性更匹配,能有效支撑高并发下的实时通信需求。
6) 【追问清单】
7) 【常见坑/雷区】