某短视频大厂的真实面试解析与总结(二)

11. Dubbo的原理

Dubbo是阿里巴巴开源的一款高性能的分布式RPC框架,主要用于服务的远程调用和服务治理。其核心原理主要包括以下几个方面:​编辑

  1. 服务提供者:Dubbo的服务提供者是一个暴露服务的应用,暴露的服务会注册到注册中心,等待消费者请求。
  2. 服务消费者:消费者是请求服务的应用,通过注册中心查找服务提供者的地址,并发起远程调用。
  3. 注册中心:Dubbo的注册中心负责服务的注册与发现,消费者通过注册中心动态查找服务提供者地址。常见的注册中心有Zookeeper、Nacos等。
  4. 远程通信:Dubbo通过不同的协议(如Dubbo协议、HTTP、WebService等)实现不同服务之间的远程通信。
  5. 负载均衡:消费者通过负载均衡算法选择合适的服务提供者进行调用。
  6. 容错处理:Dubbo提供了多种容错机制,如重试、失败转移等,确保系统的高可用性。

12. Dubbo的负载均衡 ​编辑

Dubbo的负载均衡是通过多种算法来分配请求到多个服务提供者上,常见的负载均衡策略包括:

  • 随机:随机选择一个服务提供者进行请求。
  • 轮询:按照一定的顺序轮流选择服务提供者进行请求。
  • 最小活跃:选择当前请求数最少的服务提供者。
  • 加权轮询:基于权重值进行轮询分配,权重大的服务提供者获得更多的请求。
  • 一致性哈希:根据请求参数的哈希值来选择服务提供者,保证同一个请求参数总是调用同一个服务提供者。

13. Dubbo的SPI源码 ​编辑

Dubbo的SPI(Service Provider Interface)机制允许动态加载和切换各种扩展点,Dubbo通过SPI机制使得服务提供者能够替换某些功能的实现。Dubbo的SPI机制主要由以下几个部分组成:

  • ExtensionLoader :负责加载和管理扩展点。ExtensionLoader类通过反射机制加载服务提供者的实现类,并返回相应的实例。
  • @SPI注解:用于标注接口为可扩展接口,Dubbo会根据该接口的实现类进行动态加载。
  • 扩展点配置文件 :在META-INF/dubbo/目录下,有一个名为dubbo.extensions的配置文件,用于列举扩展点的实现类。

SPI源码的核心在于通过反射和配置文件加载不同的扩展,实现了高度的可插拔性和扩展性。

14. Redis的分布式锁 ​编辑

Redis的分布式锁是一种基于Redis的键值对机制来实现的锁。其基本原理如下:

  1. 设置锁 :客户端通过SETNX(SET if Not eXists)命令尝试设置锁。若键不存在,则成功设置并获得锁。
  2. 锁的有效期:为了防止死锁,Redis的分布式锁一般会设置一个过期时间,避免因为程序异常导致锁永远无法释放。
  3. 释放锁 :通过DEL命令释放锁,但在释放之前,需要确保是当前持有锁的客户端来执行删除操作。编辑

常用的实现方式是设置一个标识当前锁拥有者的唯一值(如UUID),在释放锁时,先检查该值是否匹配。​编辑

15. RedLock算法

RedLock是由Redis的创造者Antirez提出的分布式锁算法,旨在提高分布式环境下锁的可靠性。其原理如下:​编辑

  1. 多实例获取锁:RedLock要求使用多个Redis实例(通常是5个),客户端通过同时向多个Redis实例请求加锁。
  2. 锁的获取条件:客户端需要在给定的时间内,至少在N个Redis实例上成功获取到锁(通常是N=3)。
  3. 释放锁:客户端需要在所有获得锁的Redis实例上同时释放锁。
  4. 容错性:即使某些Redis实例不可用,RedLock仍能保持较高的可用性和一致性。

RedLock相较于传统的单实例Redis锁,具有更高的容错性和可靠性。

16. RocketMQ的事务最终一致性

RocketMQ的事务最终一致性通过支持事务消息来实现。事务消息的核心思想是将发送消息的操作分为两阶段:一是发送消息,二是提交消息。

  1. 第一阶段:生产者发送事务消息到Broker,并标记为"事务消息"。
  2. 第二阶段:生产者根据业务操作的结果(如数据库操作)决定提交或回滚消息。如果业务操作成功,生产者发送提交事务的请求;如果失败,则发送回滚事务的请求。

这种方式能够保证消息的最终一致性,即使系统出现故障,仍能保证事务的可靠性。

17. RocketMQ事务模型

RocketMQ事务模型基于消息队列的两阶段提交协议,主要包括以下步骤:

  1. 发送事务消息:生产者发送消息到RocketMQ Broker,并将消息标记为"事务消息"。
  2. 事务回调:生产者会启动一个事务回调函数来处理实际的业务逻辑,通常是对数据库或其他系统进行操作。
  3. 提交或回滚:根据事务执行的结果,生产者会发送事务提交或回滚的请求给RocketMQ Broker。

RocketMQ的事务模型通过保证消息的投递和最终一致性,确保了消息在分布式系统中的可靠传递。

18. 为什么用Sentinel ​编辑

Sentinel是阿里巴巴开源的分布式流量控制框架,主要用于服务熔断、限流和容错等方面。使用Sentinel的原因包括:

  • 高可用性:Sentinel能够有效地防止系统过载,通过流量控制机制保护系统。
  • 灵活性:支持各种流量控制策略,如QPS限流、并发线程数限流等。
  • 熔断降级:当系统处于过载状态时,Sentinel可以进行熔断处理,快速恢复系统的稳定性。
  • 实时监控:Sentinel提供了详细的实时监控功能,可以实时查看服务的健康状况和流量统计。

19. 限流都有哪些算法

常见的限流算法有以下几种:

  1. 漏桶算法:通过设置固定的出水速度和漏水桶的容量来控制流量,超出桶容量的请求会被丢弃。
  2. 令牌桶算法:令牌桶有一个固定容量,按照设定的速率发放令牌,只有获取到令牌的请求才能继续执行。适用于平滑流量控制。
  3. 计数器算法:通过固定时间窗口内的请求次数来控制请求的流量。
  4. 滑动窗口算法:在滑动窗口内统计请求次数,以实现对请求的精确控制。

20. 给我讲一下令牌桶

令牌桶算法是一种常用的限流算法,核心思想是通过令牌的生成和消耗来控制请求的速率。令牌桶的实现过程如下:

  • 令牌生成:令牌按照固定的速率放入桶中,桶的容量是有限的,当桶满时,新的令牌会被丢弃。
  • 请求处理:每个请求都需要从桶中获取一个令牌,如果桶中有令牌,处理请求;如果没有令牌,拒绝请求或等待。

令牌桶算法能够平滑地控制流量,适合用于流量的平滑控制和防止突发流量对系统的冲击。

21. 讲一下Dubbo的服务降级源码

Dubbo的服务降级功能是为了在服务调用出现异常或超时的情况下,能够自动将请求降级到预设的替代逻辑。其源码实现主要包括:

  1. 降级策略定义:Dubbo支持自定义降级策略,例如返回默认值、执行备用方法等。
  2. 容错策略 :通过fallback注解或者配置文件设置降级策略,Dubbo会在调用失败时执行相应的备用逻辑。
  3. 扩展点实现 :Dubbo的服务降级机制依赖于SPI扩展,通过实现Cluster接口和Invoker接口,可以实现自定义的降级策略。

Dubbo的服务降级是通过引入容错机制,确保系统在部分服务失败的情况下,依然能够保证系统的可用性和稳定性。

总结

在本篇文章中,我们详细介绍了Dubbo、Redis、RocketMQ和Sentinel等技术的原理和应用。这些技术在分布式系统中扮演着重要

相关推荐
桂花很香,旭很美5 小时前
智能体技术架构:从分类、选型到落地
人工智能·架构
有来技术8 小时前
Spring Boot 4 + Vue3 企业级多租户 SaaS:从共享 Schema 架构到商业化套餐设计
java·vue.js·spring boot·后端
东东5169 小时前
学院个人信息管理系统 (springboot+vue)
vue.js·spring boot·后端·个人开发·毕设
三水不滴9 小时前
Redis缓存更新策略
数据库·经验分享·redis·笔记·后端·缓存
sxgzzn10 小时前
能源行业智能监测产品与技术架构解析
架构·数字孪生·无人机巡检
xiaoxue..10 小时前
React 手写实现的 KeepAlive 组件
前端·javascript·react.js·面试
快乐非自愿10 小时前
【面试题】MySQL 的索引类型有哪些?
数据库·mysql·面试
小邓吖10 小时前
自己做了一个工具网站
前端·分布式·后端·中间件·架构·golang
南风知我意95710 小时前
【前端面试2】基础面试(杂项)
前端·面试·职场和发展
大爱编程♡11 小时前
SpringBoot统一功能处理
java·spring boot·后端