面试题答案
一键面试1. Spring Cloud控制总线维持系统一致性原理
- 配置变更:Spring Cloud Bus 基于消息代理(如 RabbitMQ、Kafka)。当配置中心(如 Spring Cloud Config)的配置发生变化时,会向消息代理发送一条消息。各个微服务通过监听这个消息代理,接收到配置变更的消息后,自动更新自身配置,从而保证所有微服务使用一致的最新配置。
- 状态同步:类似地,对于一些需要在微服务间同步的状态信息,也可以借助消息代理,通过总线广播相关状态变更消息,使各个微服务能够及时同步状态。
2. 实际案例中可能出现的一致性问题及解决方案
案例场景:假设一个电商微服务系统,包括商品服务、订单服务、库存服务等。库存服务的库存数量是一个关键状态,当商品被下单时,订单服务需要通知库存服务扣减库存。
一致性问题:
- 消息丢失:如果消息代理出现故障,可能导致库存扣减的消息丢失,使得订单已生成但库存未扣减,出现数据不一致。
- 网络延迟:不同微服务所在的网络环境不同,可能存在网络延迟。库存服务收到扣减消息但处理缓慢,订单服务可能会错误地认为库存扣减失败,进行重复操作,也会导致数据不一致。
解决方案:
- 消息持久化:对于消息代理,开启消息持久化功能。以 RabbitMQ 为例,将消息设置为持久化,这样即使 RabbitMQ 服务器重启,消息也不会丢失。
- 重试机制:在订单服务中添加重试逻辑。当调用库存服务扣减库存失败后,按照一定的策略进行重试,例如指数退避策略,每次重试间隔逐渐增大,防止过于频繁重试导致系统资源耗尽。同时,库存服务需要保证接口的幂等性,即多次调用产生的效果和一次调用相同,避免重复扣减库存。
3. Spring Cloud控制总线的关键作用
- 广播通知:在上述案例中,Spring Cloud Bus 可以作为一个广播机制,当订单生成后,通过总线向库存服务发送扣减库存消息,确保所有相关微服务都能接收到状态变更的通知。
- 简化架构:避免了每个微服务都需要单独实现复杂的消息通信逻辑,降低了系统的耦合度,使得系统架构更加清晰,维护起来更加容易。同时,它基于成熟的消息代理技术,保证了消息传递的可靠性和高效性,从而有助于维持系统在配置变更、状态同步等操作时的一致性。