2021腾讯java面试题精选,java面试题汇总

springboot全家桶 springboot全家桶     2022-12-06     587

关键词:

分布式锁的坑

高并发场景下的问题

以下问题不是说在并发不高的场景下不容易出现,只是在高并发场景下出现的概率更高些而已。

性能问题来自于以下两方面:

**①获取锁的时间上。**如果 Redlock 运用在高并发的场景下,存在 N 个 Master 节点,一个一个去请求,耗时会比较长,从而影响性能。

这个好解决,通过上面描述不难发现,从多个节点获取锁的操作并不是一个同步操作,可以是异步操作,这样可以多个节点同时获取。

即使是并行处理的,还是得预估好获取锁的时间,保证锁的 TTL>获取锁的时间+任务处理时间。

**②被加锁的资源太大。**加锁的方案本身就是会为了正确性而牺牲并发的,牺牲和资源大小成正比,这个时候可以考虑对资源做拆分。

拆分的方式有如下两种:

**①从业务上将锁住的资源拆分成多段,每段分开加锁。**比如,我要对一个商户做若干个操作,操作前要锁住这个商户,这时我可以将若干个操作拆成多个独立的步骤分开加锁,提高并发。

**②用分桶的思想,将一个资源拆分成多个桶,一个加锁失败立即尝试下一个。**比如批量任务处理的场景,要处理 200w 个商户的任务,为了提高处理速度,用多个线程,每个线程取 100 个商户处理,就得给这 100 个商户加锁。

如果不加处理,很难保证同一时刻两个线程加锁的商户没有重叠,这时可以按一个维度。

比如某个标签,对商户进行分桶,然后一个任务处理一个分桶,处理完这个分桶再处理下一个分桶,减少竞争。

**重试的问题:**无论是简单实现还是 Redlock 实现,都会有重试的逻辑。

如果直接按上面的算法实现,是会存在多个 Client 几乎在同一时刻获取同一个锁,然后每个 Client 都锁住了部分节点,但是没有一个 Client 获取大多数节点的情况。

解决的方案也很常见,在重试的时候让多个节点错开,错开的方式就是在重试时间中加一个随机时间。这样并不能根治这个问题,但是可以有效缓解问题,亲试有效。

节点宕机

对于单 Master 节点且没有做持久化的场景,宕机就挂了,这个就必须在实现上支持重复操作,自己做好幂等。对于多 Master 的场景,比如 Redlock,我们来看这样一个场景:

  • 假设有 5 个 Redis 的节点:A、B、C、D、E,没有做持久化。

  • Client1 从 A、B、C 这3 个节点获取锁成功,那么 client1 获取锁成功。

  • 节点 C 挂了。

  • Client2 从 C、D、E 获取锁成功,client2 也获取锁成功,那么在同一时刻 Client1 和 Client2 同时获取锁,Redlock 被玩坏了。

怎么解决呢?最容易想到的方案是打开持久化。持久化可以做到持久化每一条 Redis 命令,但这对性能影响会很大,一般不会采用,如果不采用这种方式,在节点挂的时候肯定会损失小部分的数据,可能我们的锁就在其中。

另一个方案是延迟启动。就是一个节点挂了修复后,不立即加入,而是等待一段时间再加入,等待时间要大于宕机那一刻所有锁的最大 TTL。

但这个方案依然不能解决问题,如果在上述步骤 3 中 B 和 C 都挂了呢,那么只剩 A、D、E 三个节点,从 D 和 E 获取锁成功就可以了,还是会出问题。

那么只能增加 Master 节点的总量,缓解这个问题了。增加 Master 节点会提高稳定性,但是也增加了成本,需要在两者之间权衡。

任务执行时间超过锁的 TTL

之前产线上出现过因为网络延迟导致任务的执行时间远超预期,锁过期,被多个线程执行的情况。

这个问题是所有分布式锁都要面临的问题,包括基于 Zookeeper 和 DB 实现的分布式锁,这是锁过期了和 Client 不知道锁过期了之间的矛盾。

在加锁的时候,我们一般都会给一个锁的 TTL,这是为了防止加锁后 Client 宕机,锁无法被释放的问题。

但是所有这种姿势的用法都会面临同一个问题,就是没法保证 Client 的执行时间一定小于锁的 TTL。

虽然大多数程序员都会乐观的认为这种情况不可能发生,我也曾经这么认为,直到被现实一次又一次的打脸。

Martin Kleppmann 也质疑过这一点,这里直接用他的图:

  • Client1 获取到锁。

  • Client1 开始任务,然后发生了 STW 的 GC,时间超过了锁的过期时间。

  • Client2 获取到锁,开始了任务。

  • Client1 的 GC 结束,继续任务,这个时候 Client1 和 Client2 都认为自己获取了锁,都会处理任务,从而发生错误。

Martin Kleppmann 举的是 GC 的例子,我碰到的是网络延迟的情况。不管是哪种情况,不可否认的是这种情况无法避免,一旦出现很容易懵逼。

如何解决呢?一种解决方案是不设置 TTL,而是在获取锁成功后,给锁加一个 watchdog,watchdog 会起一个定时任务,在锁没有被释放且快要过期的时候会续期。

总结

大型分布式系统犹如一个生命,系统中各个服务犹如骨骼,其中的数据犹如血液,而Kafka犹如经络,串联整个系统。这份Kafka源码笔记通过大量的设计图展示、代码分析、示例分享,把Kafka的实现脉络展示在读者面前,帮助读者更好地研读Kafka代码。

需要免费领取这份Kafka源码笔记的铁汁们,麻烦帮忙转发一下这篇文章+关注我,然后戳这里免费获取!

费领取这份Kafka源码笔记的铁汁们,麻烦帮忙转发一下这篇文章+关注我,然后戳这里免费获取!**

就这一次!拼多多内部架构师培训Kafka源码笔记(现已绝版)

分享互联网2021年最新java面试题汇总整理-附详细答案解析

>>号外:关注“Java精选”公众号,回复“面试资料”关键词,领取全套Java面试相关资料,包含简历制作、简历模版、java面试题、视频等资料。​Java面试前需要做足各方面的准备工作,大家肯定都会浏览大量的面试题过往的... 查看详情

2021腾讯java面试题精选,90%的人看完都说好

线程线程的启动实现Runnab1e接口继承Thread类实现Callable接口线程的状态线程的方法线程的优先级守护线程未捕获异常处理器并发编程的问题线程引入开销:上下文切换与内存同步线程安全性(原子性+可见性)死锁线... 查看详情

java面试java基础,2021年阿里java面试题精选

01Java技术概览02Java开发工具及环境设置03Java语言中的数据类型与运算符04程序设计中的流程控制05数组06字符串的处理07类和对象08重载和包09继承和多态第10章接口与内部类Kafka进阶篇知识点Kafka高级篇知识点44个Kafka知识点(基... 查看详情

2021年互联网行业,1k+java面试题精选!(内附答案解析及面试攻略)

2021年的互联网行业竞争越来越严峻,面试也是越来越难,一直以来我都想整理一套完美的面试宝典,奈何难抽出时间,这套1000+道的Java面试手册整整准备了三个月,上传到GitHub上目前star数达到了30K+。这... 查看详情

2021年互联网行业,1k+java面试题精选!(内附答案解析及面试攻略)

2021年的互联网行业竞争越来越严峻,面试也是越来越难,一直以来我都想整理一套完美的面试宝典,奈何难抽出时间,这套1000+道的Java面试手册整整准备了三个月,上传到GitHub上目前star数达到了30K+。这... 查看详情

java八股文面试题(重点)

Java面试题大全(2020版)JAVA面试八股文Java八股文2021互联网大厂面试问题集合《剑指offer》Java版全系列题解(2021版,持续更新!)2020最新-精选基础算法100题(面试必备)Java基础知识面试题(202... 查看详情

java八股文面试题(重点)

Java面试题大全(2020版)JAVA面试八股文Java八股文2021互联网大厂面试问题集合《剑指offer》Java版全系列题解(2021版,持续更新!)2020最新-精选基础算法100题(面试必备)Java基础知识面试题(202... 查看详情

2021最新阿里java高级面试题及答案,大厂面试题汇总(代码片段)

什么是数据脱敏先来看看什么是数据脱敏?数据脱敏也叫数据的去隐私化,在我们给定脱敏规则和策略的情况下,对敏感数据比如手机号、银行卡号等信息,进行转换或者修改的一种技术手段,防止敏感数据... 查看详情

2021java面试题汇总全剧终?含答案及十八套面试题免费下载(代码片段)

目录前言一、Java面试之MyBatis什么是MyBatis?讲下MyBatis的缓存Mybatis是如何进行分页的?分页插件的原理是什么?简述Mybatis的插件运行原理,以及如何编写一个插件?Mybatis动态sql是做什么的?都有熟些动态sql?能... 查看详情

2021秋招最新java面试题|垃圾收集器题目汇总(代码片段)

JAVA基础篇面试题文章目录JAVA基础篇面试题1.简述四种垃圾回收器串行垃圾回收器(serial)并行垃圾回收器(Parallel)并发垃圾回收器(CMS)G1垃圾回收器2.配置JVM的垃圾回收器3.垃圾收集器对应收集区域4.JVM... 查看详情

2021精选1万道大厂java中高级面试题,面试官能问到的都有

又是一年过去了,职场的积雪还没有消融,又迎来了一次大考。疫情还没完全过去,大家强打起精神,相互问好致意,眼角却满是疲惫...企业调薪、裁员、组织架构调整等等,坏消息只多不少,最近也... 查看详情

2021年阿里腾讯字节等大厂技术面试题汇总,西安富士通java笔试题

...;有什么区别Intent可以传递哪些数据类型(文末附面试答案)腾讯面试整理HashMap和HashTable以及CurrentHashMap的区别。Java的四大引用Jvm内存区域是如何划分的?Jvm内存模型是怎么样的?TCP与UDP的区别。三次握手、四次挥手。为啥... 查看详情

2021年互联网行业,1k+java面试题精选!(内附答案解析及面试攻略)

2021年的互联网行业竞争越来越严峻,面试也是越来越难,一直以来我都想整理一套完美的面试宝典,奈何难抽出时间,这套1000+道的Java面试手册整整准备了三个月,上传到GitHub上目前star数达到了30K+。这... 查看详情

熬夜肝完了,腾讯前端,java,c++,go面经汇总(全)

大家好,我是帅地。之前我给大家整理了一份Java和一份C++的硬核面试题(附答案),详情可以看这里15万字C++开发硬核面试题20万字Java硬核面试题面试题最大的好处就是验证你知识掌握的如何,并且也能替你... 查看详情

熬夜肝完了,腾讯前端,java,c++,go面经汇总(全)

大家好,我是帅地。之前我给大家整理了一份Java和一份C++的硬核面试题(附答案),详情可以看这里15万字C++开发硬核面试题20万字Java硬核面试题面试题最大的好处就是验证你知识掌握的如何,并且也能替你... 查看详情

2021精选java后端面试题资料大全springboot,kafka,mysql,redis等pdf资料,实战项目,阿里巴巴,腾讯,字节,京东,美团,滴滴,bilibili面试经历,实用干货

      大家可以通过在公众号【面试官求放过】,点击下方菜单的【面试题】->【Java面试资料大全】无偿获取下载地址。该公众号还会每周更新两个面试时可能遇到的场景题哦。资料仅供各位学习使用,请勿用于别... 查看详情

java并发编程面试题(2021最新版)

Java基础知识面试题以及进阶指南(2021最新版):https://blog.csdn.net/xmtblog/article/details/120006378文章目录Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了... 查看详情

java并发编程面试题(2021最新版)

Java基础知识面试题以及进阶指南(2021最新版):https://blog.csdn.net/xmtblog/article/details/120006378文章目录Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了... 查看详情