51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

招聘系统采用微服务架构,用户服务与职位服务通过API网关进行通信。请说明微服务间通信的常见方式(如RESTful、gRPC),并讨论如何处理网络延迟、超时、重试等问题,以及如何保证服务间的容错性。

八方职达 | 广州创思信息技术有限公司后端开发难度:中等

答案

1) 【一句话结论】微服务间通信主要采用RESTful(HTTP+JSON)和gRPC(HTTP2+Protobuf),需通过超时控制、指数退避重试、熔断降级等机制处理网络延迟与超时,并借助断路器、降级、限流等保证服务间容错性,避免级联故障。

2) 【原理/概念讲解】
老师:咱们先讲两种核心通信方式。

  • RESTful:基于HTTP协议,用JSON做数据格式,遵循“无状态、资源标识”原则。比如用户服务调用职位服务查职位列表,发GET /api/jobs?status=active请求,响应JSON数据。优点是跨语言支持好(前端JS、后端Java都能用),松耦合;缺点是序列化开销大,网络传输效率低,可能受HTTP 1.1连接复用限制。
  • gRPC:基于HTTP/2,用Protocol Buffers定义接口和消息,二进制序列化。比如定义JobService服务,提供GetJobs RPC方法。优点是序列化快(比JSON小30%)、性能高,支持流式传输;缺点是需要双方都支持Protobuf,跨语言编译依赖工具,对技术栈有要求。

网络延迟与超时:实际部署中,网络抖动(如延迟突然增加)会导致请求超时,需合理设置超时时间(如查询操作超时2秒,写入操作1秒),避免客户端长时间阻塞。重试策略:失败后用指数退避(第一次重试1秒,第二次2秒,指数增长),避免短时间内大量重试导致服务器雪崩。容错性:断路器模式(如Hystrix),当服务调用失败次数超阈值(如5次),断路器打开,后续请求直接返回失败或默认值,防止级联故障;结合降级(服务不可用时返回缓存数据),限流(熔断器+限流控制请求速率)。

3) 【对比与适用场景】

通信方式定义特性使用场景注意点
RESTful基于HTTP协议,JSON数据,无状态资源调用跨语言支持好,松耦合,HTTP 1.1连接复用,序列化开销大异构系统集成(如前端调用后端)、轻量级调用(查询、简单操作)需考虑HTTP状态码,序列化效率低,不适合高频大流量
gRPC基于HTTP/2,Protobuf二进制序列化,流式传输序列化效率高,性能优,支持流式,HTTP/2连接复用高性能场景(实时通信、高频内部调用)、内部服务间通信需支持Protobuf,跨语言编译,对技术栈有要求,HTTP/2需双方配置

4) 【示例】

  • RESTful示例:用户服务调用职位服务查询职位列表,发送GET请求:
    GET /api/jobs?status=active HTTP/1.1
    Host: job-service
    Accept: application/json
    
    职位服务响应JSON:
    [
      {"id":1,"title":"后端开发","location":"广州","status":"active"},
      ...
    ]
    
  • gRPC示例:用户服务调用职位服务,定义JobService服务:
    service JobService {
      rpc GetJobs (GetJobsRequest) returns (GetJobsResponse);
    }
    message GetJobsRequest {
      string status = 1;
    }
    message GetJobsResponse {
      repeated Job job = 1;
    }
    message Job {
      int32 id = 1;
      string title = 2;
      string location = 3;
      string status = 4;
    }
    
    用户服务调用:
    // Java gRPC客户端
    JobServiceGrpc.JobServiceBlockingStub stub = JobServiceGrpc.newBlockingStub(channel);
    GetJobsResponse response = stub.getJobs(GetJobsRequest.newBuilder().setStatus("active").build());
    

5) 【面试口播版答案】
“微服务间通信常用RESTful(HTTP+JSON)和gRPC(HTTP2+Protobuf)。RESTful适合异构系统,比如用户服务调用职位服务查职位列表用GET请求;gRPC性能更高,适合高频内部调用。处理网络延迟,设置合理超时(如查询2秒),避免阻塞。重试用指数退避(1秒→2秒),防雪崩。容错性方面,用熔断器(如Hystrix),失败次数超阈值断开调用,返回默认值;结合降级(服务不可用时用缓存数据),保证即使某服务故障,系统仍能运行。”

6) 【追问清单】

  • 问:为什么选RESTful而非gRPC?
    答:RESTful跨语言支持好,异构系统易集成(如前端JS+后端Java),gRPC需要双方支持Protobuf,若团队技术栈不统一,RESTful更灵活。
  • 问:超时时间如何确定?
    答:根据业务场景,查询操作响应通常1-2秒,超时设2秒;写入操作(如保存职位)响应快,超时设1秒,避免长时间等待。
  • 问:熔断器具体实现?
    答:用Spring Cloud Hystrix,配置断路器阈值(失败次数>5次断开),打开后后续请求直接返回失败,恢复后自动重试。
  • 问:如何处理幂等性?
    答:重试操作(如重试保存职位)需保证幂等,比如数据库加唯一索引或用乐观锁,避免重复提交。
  • 问:gRPC流式传输如何用?
    答:用户服务实时获取职位更新,职位服务通过流式RPC推送数据,用户服务订阅后接收实时消息。

7) 【常见坑/雷区】

  • 超时时间设置不合理:超时太短导致正常请求失败,太长阻塞客户端。
  • 重试策略不当:指数退避间隔过短或次数过多,导致服务器雪崩。
  • 熔断器配置不当:阈值过低频繁断开,过高无法及时恢复。
  • 协议选择忽略技术栈:团队用Java但选gRPC,需额外学习Protobuf,增加开发成本。
  • 忽略幂等性:重试操作未处理,导致数据重复写入,影响一致性。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1