gRPC、REST、Connect-RPC 与 tRPC

共 63 题
#

1. gRPC 的流式模式(unary/server streaming/client streaming/bidi)在 Java 中的线程模型与背压控制

A 背压只依赖应用层缓冲,协议层不参与
B 所有流式调用都必须在调用线程上执行
C 背压只在 unary 模式下存在
D 通过 HTTP/2 流控窗口与 OutboundFlowController 实现有限背压 ✓ 正确答案
#

2. gRPC 的 Channel 连接管理与 keepalive,在虚拟线程下如何复用连接并控制并发流

A 虚拟线程可以无限制地创建并发流
B keepalive 在虚拟线程下不再需要
C 并发流仍受 MAX_CONCURRENT_STREAMS 限制,超出需排队 ✓ 正确答案
D 每个虚拟线程必须拥有独立连接
#

3. REST 的幂等性设计,PUT/DELETE 的幂等语义与 POST 的幂等键(Idempotency-Key)实践

A POST 天然幂等
B 幂等键由服务端自动生成
C PUT 一定产生重复副作用
D 幂等键需服务端原子判重并缓存结果,保证重试安全 ✓ 正确答案
#

4. gRPC 错误模型(google.rpc.Status)与 HTTP 状态码的映射规则,客户端如何区分可重试与失败

A RESOURCE_EXHAUSTED
B DEADLINE_EXCEEDED
C INVALID_ARGUMENT ✓ 正确答案
D UNAVAILABLE
#

5. REST API 的版本化策略,URI 版本、Accept 头版本与查询参数版本的取舍

A 查询参数版本最利于共享缓存
B Accept 头版本在浏览器中渲染最直观
C URI 版本便于日志与路由但污染 URI ✓ 正确答案
D 三种方式缓存行为完全一致
#

6. REST 的 ETag、条件请求与共享缓存用于读接口时,为什么常比把所有调用改成 RPC 更有效

A 共享缓存可拦截大量读请求,减少后端压力 ✓ 正确答案
B 304 响应含完整正文
C RPC 天然具备 HTTP 缓存语义
D ETag 用于强制写操作
#

7. gRPC 的 deadline 传播,跨服务调用时剩余时间如何递减传递,客户端如何提前取消

A deadline 到期后服务端仍会继续执行
B 每个服务独立设置固定超时,互不影响
C deadline 通过 grpc-timeout 头传递,下游使用剩余时间 ✓ 正确答案
D 取消不会传播到下游
#

8. HTTP/2 多路复用下 REST 服务的连接池设计,与 HTTP/1.1 keep-alive 的差异

A HTTP/1.1 无队头阻塞
B HTTP/2 仍需每请求一条连接
C HTTP/2 用多路复用流承载并发请求,减少连接数 ✓ 正确答案
D HTTP/2 同连接请求必须串行
#

9. REST 分页设计,cursor/offset 分页在数据一致性与性能上的取舍

A offset 分页在数据增删时仍能保持稳定
B cursor 分页支持任意随机跳页
C offset 分页基于索引定位
D cursor 分页基于索引定位,避免深 OFFSET 扫描 ✓ 正确答案
#

10. gRPC 负载均衡,客户端 LB 与服务器 LB(xDS)在连接池管理上的差异

A xDS LB 通过控制面下发集群与端点,支持动态治理 ✓ 正确答案
B 客户端 LB 由控制面管理端点
C 两者连接池管理完全相同
D xDS LB 无需额外控制面组件
#

11. tRPC 与 gRPC 在协议设计、服务治理与多语言生态上的对比

A tRPC 服务治理能力弱于 gRPC
B gRPC 生态更标准化,云原生与网格支持成熟 ✓ 正确答案
C 两者协议底层完全相同
D tRPC 不基于 Protobuf
#

12. gRPC 的健康检查协议(grpc.health.v1)与 Kubernetes 探针的集成

A readiness 探针用于决定是否重启容器
B liveness 探针用于决定是否接收流量
C gRPC 探针通过 Health 服务反映真实健康并支持摘流 ✓ 正确答案
D TCP 探针能反映应用真实业务状态
#

13. REST 的缓存策略,Cache-Control、ETag 与条件请求(If-None-Match)的配合

A ETag 用于控制缓存新鲜度
B no-store 表示可缓存但需验证
C 304 响应包含完整资源正文
D 缓存过期后用 If-None-Match 验证,未变化返回 304 ✓ 正确答案
#

14. gRPC 反射(ServerReflection)与 grpcurl 在调试中的应用,生产环境如何关闭

A 反射不影响信息安全
B grpcurl 必须持有 proto 文件才能调用
C 生产环境应默认开启反射
D 反射让客户端动态获取服务描述,无需预置 proto ✓ 正确答案
#

15. REST 接口的请求追踪,trace 上下文在网关、负载均衡与应用间的传递规范

A 网关不需要解析 trace 上下文
B 每个组件各自生成独立 trace-id 即可
C 按 W3C Trace Context 用 traceparent 关联同一 trace 的 span ✓ 正确答案
D tracestate 用于传递 trace-id
#

16. 反向代理观测应如何关联 request_id、upstream_addr、upstream_status 与各阶段耗时定位网关或应用瓶颈

A 瓶颈可能在网关自身或网络 ✓ 正确答案
B 后端返回 5xx
C 后端应用处理慢
D 数据库查询慢
#

17. REST 与 gRPC 双协议暴露时的序列化与错误模型统一问题

A 用同一 Protobuf 契约并统一错误码映射可保持语义一致 ✓ 正确答案
B 错误模型无需统一
C gRPC 序列化必须用 JSON
D 两套协议应各自独立定义契约
#

18. OpenAPI 规范驱动的契约测试,如何用 schema 校验请求与响应

A 用 OpenAPI 的 JSON Schema 校验请求与响应,保证符合契约 ✓ 正确答案
B schema 校验只检查响应状态码
C 契约测试与文档无关
D schema 校验无法用于请求体
#

19. Connect-RPC 的拦截器(Interceptor)如何实现认证、日志与重试的横切逻辑

A 认证、日志、重试等横切逻辑可以通过拦截器统一实现 ✓ 正确答案
B 拦截器无法进行重试
C 拦截器对三种协议需分别实现
D 拦截器只能用于日志
#

20. gRPC 拦截器与 REST 过滤器在认证/限流上的职责划分

A 拦截器无法做认证
B 两者职责完全不同
C REST 过滤器处理 gRPC 请求
D 两者都可在协议入口实现认证、限流等横切逻辑 ✓ 正确答案
#

21. REST 服务的重试安全,仅对幂等请求自动重试,非幂等请求如何用幂等键保护

A 幂等键由服务端生成
B 非幂等 POST 需用幂等键保证服务端只执行一次 ✓ 正确答案
C GET 请求重试会产生重复副作用
D 所有请求都可直接自动重试
#

22. gRPC 流式响应的取消,客户端取消后服务端如何感知并停止计算

A 客户端取消不会传播到服务端
B 取消后服务端必须继续计算
C 服务端通过 onCancel 感知并停止计算、释放资源 ✓ 正确答案
D 取消仅影响客户端
#

23. HTTP 客户端连接复用,Java HttpClient 的 HTTP/2 连接池与并发流限制

A 并发流不受限制
B 单条 HTTP/2 连接承载多个并发流,超出 MAX_CONCURRENT_STREAMS 时排队 ✓ 正确答案
C 每个请求必须建立独立连接
D HTTP/2 不支持连接复用
#

24. RPC 调用的超时分层,连接超时、请求超时与总 deadline 如何设置与递减

A 连接超时应长于请求超时
B 只需设置一个超时即可
C 下游获得的剩余时间 = 总 deadline - 已耗时 ✓ 正确答案
D 总 deadline 应小于各环节超时之和
#

25. Connect-RPC 的 JSON 与二进制编码同时开放时,网关、日志和错误详情应如何避免泄露敏感字段

A 二进制输出会泄露敏感字段
B 只有 JSON 需要脱敏
C 错误详情应返回全部字段
D 应通过 schema 标注并在日志、错误详情、网关统一脱敏 ✓ 正确答案
#

26. Protobuf 的序列化性能与 Java 反射式 JSON 的对比,RPC 场景为何倾向二进制

A Protobuf 依赖反射序列化
B Protobuf 通过代码生成与紧凑编码,体积小、速度快 ✓ 正确答案
C JSON 编码比 Protobuf 更紧凑
D Protobuf 无法演进 schema
#

27. REST 错误响应的设计,Problem Details(RFC 9457)的字段约定与客户端解析

A 客户端无法解析该结构
B type、title、status、detail、instance 构成标准错误结构 ✓ 正确答案
C 错误响应只有 status 字段
D 媒体类型是 application/json
#

28. gRPC 服务定义(.proto)的向后兼容,字段编号、reserved 与 oneof 的演进规则

A oneof 可同时包含多个被设置字段
B 删除字段应保留编号,新建字段用新编号以保持兼容 ✓ 正确答案
C 可随意复用已删除字段的编号
D 可随意修改字段类型
#

29. REST 与 RPC 的边界,什么业务适合 REST 资源模型,什么适合过程调用模型

A 资源化、可缓存、公开的业务适合 REST,命令式内部高频适合 RPC ✓ 正确答案
B 动作业务适合 REST 资源模型
C RPC 天然支持 HTTP 缓存
D 所有业务都适合 REST
#

30. tRPC(腾讯)的协议与 gRPC 的差异,编解码、路由与治理能力的对比

A tRPC 治理能力内建于 SDK,gRPC 依赖外部组件 ✓ 正确答案
B tRPC 不支持 Protobuf
C 两者都不是基于 Protobuf
D gRPC 治理能力全部内建
#

31. gRPC Server 的线程模型,同步 vs 异步执行器在吞吐与延迟上的取舍

A 异步模型延迟一定更低
B 异步模型吞吐高但复杂度高,同步模型简单但占用线程 ✓ 正确答案
C 同步模型在高并发下不易耗尽线程
D 只能使用同步模型
#

32. HTTP 网关(Envoy/APISIX)如何把 REST 请求转译为 gRPC,协议转换的代价是什么

A 转译后 HTTP 缓存语义完全保留
B JSON↔Protobuf 转换与状态码映射带来开销和语义损失 ✓ 正确答案
C 转译无任何性能开销
D 网关转译不影响后端
#

33. REST 的 HATEOAS 与超媒体驱动在微服务中的实际应用边界

A 微服务普遍强制使用 HATEOAS
B HATEOAS 能减少响应体积
C 响应携带链接供客户端动态导航,但实际应用常受复杂度限制 ✓ 正确答案
D HATEOAS 与超媒体无关
#

34. gRPC 连接中 HTTP/2 流数量上限(MAX_CONCURRENT_STREAMS)如何影响并发调用

A 限制单连接上并发流数量,超出时排队或新建连接 ✓ 正确答案
B 客户端可无限突破该上限
C 限制服务端并发连接数
D 与 gRPC 调用无关
#

35. REST API 的限流头(RateLimit-*)与客户端退避(Retry-After)的标准实践

A 客户端应无视限流头无限重试
B 限流命中返回 200 并继续处理
C 429 配合 Retry-After 指示客户端退避重试 ✓ 正确答案
D RateLimit-Reset 表示剩余配额
#

36. gRPC 与 REST 在日志与追踪字段上的差异,如何统一 trace 上下文

A 两者载体不同但可用 W3C 标准上下文统一 ✓ 正确答案
B trace 上下文只在日志中有效
C 两者无法关联
D gRPC 无法传递 trace 上下文
#

37. OpenAPI 3.1 与 JSON Schema 的关系,契约定义在代码生成中的作用

A OpenAPI 3.1 采用 JSON Schema 2020-12 描述数据 ✓ 正确答案
B OpenAPI 3.1 与 JSON Schema 无关
C 契约只能用于文档
D 契约无法驱动代码生成
#

38. gRPC 的压缩(gzip 等)在 CPU 与带宽上的权衡,何时应禁用压缩

A 压缩总是降低 CPU 开销
B 所有消息都必须压缩
C 压缩只影响带宽不影响 CPU
D 对已压缩或小消息压缩收益有限,CPU 紧张时应禁用 ✓ 正确答案
#

39. REST 批量操作的实现,batch 端点 vs 多次请求在一致性与性能上的取舍

A 多次请求性能总优于 batch
B batch 减少往返但需处理部分成功的一致性问题 ✓ 正确答案
C batch 无法返回部分成功结果
D batch 天然保证原子性
#

40. gRPC 的鉴权,拦截器校验 metadata 中的 token 与 mTLS 的配合

A 只能使用其中一种
B 拦截器校验 metadata 中的 token 实现调用级鉴权,与 mTLS 配合 ✓ 正确答案
C mTLS 用于授权具体操作
D token 校验失败返回 OK
#

41. Protobuf/Avro 等二进制序列化在微服务(gRPC)场景与 JSON 相比的体积、速度与 schema 演进取舍

A 二进制更利于调试
B 二进制无法演进 schema
C Protobuf/Avro 紧凑省带宽且支持 schema 演进,微服务内部倾向二进制 ✓ 正确答案
D JSON 体积更小、速度更快
#

42. REST 的媒体类型协商,application/json 与 protobuf(application/x-protobuf)如何共存

A 二进制和 JSON 无法共享资源模型
B 同一端点只能支持一种媒体类型
C 服务端忽略 Accept 头
D 客户端用 Accept 头选择 JSON 或 Protobuf 表示 ✓ 正确答案
#

43. RPC 服务的优雅停机,先停止注册与摘流,再排空在途请求

A 摘流与排空顺序无关
B 先关闭连接再摘流
C 无需等待在途请求
D 先停止注册/摘流再排空在途请求,超时强制关闭 ✓ 正确答案
#

44. WebSocket 长连接跨版本发布时,怎样让旧连接自然排空、新连接进入新 upstream 并设置最长会话期限

A 无需处理长连接
B 会话期限与发布无关
C 新连接走新 upstream,旧连接自然排空并设最长会话期限兜底 ✓ 正确答案
D 旧连接必须立即断开切换
#

45. gRPC deadline、HTTP 网关超时和下游数据库超时应按什么顺序递减才能保留清理时间

A 各层超时相等即可
B 应内层 < 外层 < 总 deadline,留出清理时间 ✓ 正确答案
C 超时顺序不影响系统
D 内层超时应大于外层超时
#

46. gRPC 与 REST 在浏览器可达性、流式语义、缓存、错误模型和 schema 演进方面分别有哪些协议约束

A gRPC 原生支持浏览器调用
B gRPC 不原生支持流式
C REST 有 HTTP 缓存语义而 gRPC 无标准缓存 ✓ 正确答案
D 两者错误模型完全一致
#

47. 代理 WebSocket 时,Upgrade、Connection、HTTP 版本、读超时与连接排空配置缺一项会出现什么现象

A 读超时与长连接无关
B 缺少 Upgrade 头仍可正常握手
C HTTP/2 原生支持 WebSocket 握手
D 需正确转发 Upgrade/Connection 头、配置读超时与连接排空 ✓ 正确答案
#

48. 压测 unary、server streaming 与 bidirectional streaming 时,连接数、并发流和消息大小应如何分开控制

A 消息大小不影响压测
B 只需测量 QPS 即可
C 三种模式压测参数完全相同
D 应分开控制连接数、并发流、消息大小以定位瓶颈 ✓ 正确答案
#

49. 基于 split_clients、map 与 upstream 权重进行灰度时,怎样保持用户粘性并排除健康检查流量

A 用户粘性无法保证
B 用用户标识哈希保持粘性,并排除健康检查流量 ✓ 正确答案
C split_clients 与用户标识无关
D 健康检查流量应参与灰度分流
#

50. 服务同时暴露 REST 与 RPC 时,如何用一套领域错误目录生成稳定的状态码映射而不丢失可观测性

A 两协议各自维护错误码
B 用一套领域错误目录映射双协议状态码,并保留结构化详情保证可观测性 ✓ 正确答案
C 映射后无法追踪
D 错误码与状态码无关
#

51. REST 的并发控制,ETag + If-Match 实现乐观并发更新,与版本号字段的取舍

A ETag 是资源表示的隐式版本,版本号是显式字段,二者都实现 CAS ✓ 正确答案
B ETag 与 If-Match 校验失败返回 200
C If-Match 用于强制覆盖
D 版本号字段无法防并发
#

52. gRPC 的 keepalive 参数(ping 间隔、超时)在跨机房场景的调优

A 跨机房无需调优 keepalive
B keepAliveTime 越小越好
C keepAliveTimeout 应大于 RTT,避免误判连接失效 ✓ 正确答案
D ping 间隔应小于 RTT
#

53. REST 与 WebSocket 的选型,请求-响应 vs 双向实时通信的边界

A 实时双向场景用 WebSocket,请求-响应可缓存场景用 REST ✓ 正确答案
B WebSocket 更适合低频请求
C REST 支持服务端主动推送
D 两者交互模型完全相同
#

54. gRPC 的反射与健康检查在 Service Mesh 中的角色

A 健康检查用于获取服务 schema
B 两者在网格中无作用
C 反射用于端点摘除
D 健康检查用于判定服务可用性,反射用于协议发现 ✓ 正确答案
#

55. HTTP 客户端超时配置,connectTimeout/readTimeout/responseTimeout 的分层设置

A 读超时用于连接建立
B connectTimeout 应大于 responseTimeout
C 连接超时管建立连接,读超时管读取响应,响应超时管整体 ✓ 正确答案
D 只需设置一个超时
#

56. REST 请求体大小限制与流式上传,multipart 与 chunked 编码的差异

A 两者完全相同
B multipart 用于一个请求携带多字段与文件,chunked 用于传输层流式分块 ✓ 正确答案
C multipart 是传输层分块,chunked 是应用层多部分
D chunked 用于多文件
#

57. Connect-RPC 如何在同一 Protobuf 服务上提供 Connect、gRPC 与 gRPC-Web 协议,并协商内容类型

A Connect 只能支持一种协议
B Connect 通过 Content-Type 协商在 Connect/gRPC/gRPC-Web 间切换 ✓ 正确答案
C 每种协议需要独立服务定义
D gRPC 原生支持浏览器
#

58. gRPC 的 DNS 解析与负载均衡,dns:/// 与 xds:/// 解析器的差异

A xds:/// 无需外部组件
B xds:/// 从控制面获取动态端点与治理配置 ✓ 正确答案
C dns:/// 依赖控制面
D 两者解析机制相同
#

59. REST API 文档生成,springdoc-openapi 与手写契约的维护成本对比

A springdoc 无法反映实现
B springdoc 自动生成文档降低漂移,手写契约需契约测试兜底防漂移 ✓ 正确答案
C 两者维护成本相同
D 手写契约不会漂移
#

60. Protobuf 在 Java 中的使用,protoc 生成代码与 runtime 依赖的管理

A Java 无需 runtime 依赖
B protoc 只能生成 C++ 代码
C runtime 版本无需匹配
D protoc 生成 Java 类,runtime 依赖用构建工具管理 ✓ 正确答案
#

61. Protobuf 字段编号、reserved、unknown fields 与 oneof 演进规则如何保证滚动升级期间新旧 gRPC 客户端互通

A 新字段用新编号,老客户端保留 unknown fields 保证互通 ✓ 正确答案
B 老客户端应丢弃未知字段
C 字段编号可随意复用
D oneof 无演进约束
#

62. HTTP/3(QUIC)对 HTTP 客户端的影响,连接迁移与 0-RTT 的语义

A QUIC 基于 TCP
B 0-RTT 无重放风险
C 连接 ID 实现连接迁移,0-RTT 降低重连延迟 ✓ 正确答案
D HTTP/3 与连接迁移无关
#

63. gRPC 流式接口的测试,如何用 stub 模拟流并验证时序

A 只需验证第一个消息
B 时序无法验证
C 流式接口无法测试
D 用 mock StreamObserver 捕获 onNext 序列验证时序 ✓ 正确答案