天天看点

2021大厂Java春招面试经历,已拿offer附真题解析我有话要说,请仔细看完

我有话要说,请仔细看完

我发现一个现象,很多开发5年的程序员仍然停留在crud的阶段,这是什么原因?

最主要的原因就是基础很差,尤其对于JVM和并发编程这方面掌握的比较差,而JVM和并发编程就是非常非常重要的基础了,作为一个Java开发人员如果你连JVM和并发编程掌握的很差,那你是无法写出高质量的代码的,直白说,你就只能做crud的工作,理想的工作和薪资跟你是无缘的,同时也很容易被行业淘汰!

现在大厂面试肯定是从基础开始发问,下面我也贴出了阿里招聘Java开发人员的要求,可以详细的看一下,下面几道是阿里面试真题,看你能答对几道?

  • Java中的垃圾回收算法?
  • 有哪几种垃圾回收器,有哪些优缺点?cms和g1的区别?
  • 什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?
  • 什么是并发容器的实现?
  • 什么是线程池? 为什么要使用它?
    2021大厂Java春招面试经历,已拿offer附真题解析我有话要说,请仔细看完

上面我更多的是强调了基础的重要性,想要拿到阿里p6岗offer绝不是扎实的基础就能搞定的,这时候就更需要你多维度,深度,广度的学习Java技术,不多说了,直接上干货吧!

1. 消息的可靠性投递

在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。

RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。

confirm 确认模式:当消息从 producer 发送到 exchange 则会执行 confirmCallback中的confirm方法。

return 退回模式:当消息发送给Exchange后, Exchange将消息路由到queue失败会执行ReturnCallBack。

2021大厂Java春招面试经历,已拿offer附真题解析我有话要说,请仔细看完

确认模式会返回{1.相关配置信息, 2.交换机是否成功接收到消息 , true 成功 false失败 3.失败原因 }

回退模式会返回{1.消息对象,2.错误码,3.错误信息,4.交换机名称,5.路由键}

2.Consumer ACK(消费者 ACK)

ack指Acknowledge,确认。 表示消费端收到消息后的确认方式。

RabbitMQ提供三种确认方式:

自动确认: acknowledge=“none” 当消息一旦被Consumer接收到,则自动确认收到,并将相应 message 从 RabbitMQ 的消息缓存中移除。

手动确认: acknowledge=“manual” 如果出现异常,则调用channel.basicNack()方法,让其自动重新发送消息。

根据异常情况确认:acknowledge=“auto”。

3. 消息过期(TTL)

TTL 全称 Time To Live(存活时间/过期时间)。当消息到达存活时间后,还没有被消费,会被自动清除。

RabbitMQ可以对消息设置过期时间,也可以对整个队列(Queue)设置过期时间。

消息过期, 可以让队列统一过期, 也可以让它单独的消息过期。

           

4. 死信队列

死信队列,英文缩写:DLX 。Dead Letter Exchange(死信交换机),当消息成为Dead message (死信)后,可以被重新发送到另一个交换机,这个交换机就是DLX。

2021大厂Java春招面试经历,已拿offer附真题解析我有话要说,请仔细看完

消息成为死信的三种情况:

1.队列消息长度到达限制;

2.消费者拒接消费消息,并且不把消息重新放入原目标队列;

3.原队列存在消息过期设置,消息到达超时时间未被消费;

死信队列和死信交换机:

死信队列和死信交换机与正常的队列和交换机一模一样, 没有任何区别 !! 

           

如何实现队列与死信交换机绑定 , 给队列设置如下参数:

  • x-dead-letter-exchange : 设置死信交换机
  • x-dead-letter-routing-key : 设置死信路由key

5. 延迟队列

消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。 例如:

2021大厂Java春招面试经历,已拿offer附真题解析我有话要说,请仔细看完
延迟队列是一个很强大的功能 , 但是在RabbitMQ中并没有提供延迟队列功能。

可以使用:TTL(消息过期)+死信队列组合实现延迟队列的效果。

实现流程图如下 :

2021大厂Java春招面试经历,已拿offer附真题解析我有话要说,请仔细看完

6. 消费端限流

2021大厂Java春招面试经历,已拿offer附真题解析我有话要说,请仔细看完

当系统峰值比较高的时候 , 我们我们可以使用RabbitMQ实现削峰填谷, 让我们系统处理的请求更加平稳

实现步骤

  1. 设置akc机制为手动确认
  2. 配置监听容器

7.RabbitMQ应用问题 (消息补偿机制)

我们通过之前的消息可靠性投递 , ACK 确认机制 , 以及死信队列 , 基本上已经能够保证消息投递成功了 !

为什么还要消息补偿机制呢? 难道消息还会丢失,没错,系统是在一个复杂的环境,不要想的太简单了,虽然以上的三种方案,基本可以保证消息的高可用不丢失的问题,但是作为有追求的程序员来讲,要绝对保证我的系统的稳定性,有一种危机意识。

比如:持久化的消息,保存到硬盘过程中,当前队列节点挂了,存储节点硬盘又坏了,消息丢了,怎么办?

产线网络环境太复杂,所以不知数太多,所以要做消息补偿机制 !

消息补偿机制需要建立在业务数据库和MQ数据库的基础之上 , 当我们发送消息时 , 需要同时将消息数据保存在数据库中, 两者的状态必须记录。 然后通过业务数据库和MQ数据库的对比检查消费是否成功,不成功,进行消息补偿措施,重新发送消息处理

2021大厂Java春招面试经历,已拿offer附真题解析我有话要说,请仔细看完

最后

为什么我不完全主张自学?

①平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。

②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。

如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。

除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。

我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:

①价格:线上的价格基本上是线下的一半;

②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;

③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;

④课程:从课程内容来说,确实要比线下讲的更加深入。

应该学哪些技术才能达到企业的要求?(下图总结)

Java全套资料免费领取方式:戳这里

2021大厂Java春招面试经历,已拿offer附真题解析我有话要说,请仔细看完
2021大厂Java春招面试经历,已拿offer附真题解析我有话要说,请仔细看完

a全套资料免费领取方式:戳这里](https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB)**

[外链图片转存中…(img-1pnsBaQH-1620609483045)]

[外链图片转存中…(img-dnHfdxEC-1620609483046)]