2020一线互联网大厂秋招提前批的面试经验

1 Spring 依赖注入中的循环依赖怎么解决?

 

2 python中函数的参数的类型有几种?

Python的参数类型一共有5种:POSITIONAL_OR_KEYWORD、VAR_POSITIONAL、VAR_KEYWORD、KEYWORD_ONLY、POSITIONAL_ONLY。(position_or_keyword、var_positionnal、var_keyword 、keyword_only)

其中 POSITIONAL_OR_KEYWORD、VAR_POSITIONAL、VAR_KEYWORD、KEYWORD_ONLY 比较常用

3 Restful和http区别

RESTful:一种软件架构风格,设计风格而不是标准,首先REST只是一种风格,不是一种标准 , REST是以资源为中心的,REST充分利用或者说极端依赖HTTP协议。

HTTP:即超文本传输协议,是一个属于应用层的面向对象的协议。我们在 Web 应用中处理来自客户端的请求时,通常只考虑 GET 和 POST 这两种 HTTP 请求方法。实际上,HTTP 还有 HEAD、PUT、DELETE 等请求方法。而在 REST 架构中,用不同的 HTTP 请求方法来处理对资源的 CRUD(创建、读取、更新和删除)操作。

  • 若要在服务器上创建资源,应该使用 POST 方法。 
  • 若要检索某个资源,应该使用 GET 方法。 
  • 若要更改资源状态或对其进行更新,应该使用 PUT 方法。 
  • 若要删除某个资源,应该使用 DELETE 方法。

4 UDP通信常用场景?

当强调输出性能而非完整性时,如音频和多媒体的应用。QQ 微信都是的UDP的应用 ,但是我们有的时候会发送失败。这个是可靠的程序来实现的,但是的域名解析一定要TCP。

可靠的概念

在实时通信过程中,不同的需求场景对可靠的需求是不一样的,我们在这里总体归纳为三类定义:

  • 尽力可靠:通信的接收方要求发送方的数据尽量完整到达,但业务本身的数据是可以允许缺失的。例如:音视频数据、幂等性状态数据。
  • 无序可靠:通信的接收方要求发送方的数据必须完整到达,但可以不管到达先后顺序。例如:文件传输、白板书写、图形实时绘制数据、日志型追加数据等。
  • 有序可靠:通信接收方要求发送方的数据必须按顺序完整到达。

RUDP是根据这三类需求和图1的三角制约关系来确定自己的通信模型和机制的,也就是找通信的平衡点。

重传模式

IP协议在设计的时候就不是为了数据可靠到达而设计的,所以UDP要保证可靠,就依赖于重传,这也就是我们通常意义上的RUDP行为,在描述RUDP重传之前先来了解下RUDP基本框架,如图2:

2020一线互联网大厂秋招提前批的面试经验_第1张图片

RUDP在分为发送端和接收端,每一种RUDP在设计的时候会做不一样的选择和精简,概括起来就是图中的单元。RUDP的重传是发送端通过接收端ACK的丢包信息反馈来进行数据重传,发送端会根据场景来设计自己的重传方式,重传方式分为三类:定时重传,请求重传和FEC选择重传。

定时重传

定时重传很好理解,就是发送端如果在发出数据包(T1)时刻一个RTO之后还未收到这个数据包的ACK消息,那么发送就重传这个数据包。这种方式依赖于接收端的ACK和RTO,容易产生误判,主要有两种情况:

对方收到了数据包,但是ACK发送途中丢失。
ACK在途中,但是发送端的时间已经超过了一个RTO。

所以超时重传的方式主要集中在RTO的计算上,如果你的场景是一个对延迟敏感但对流量成本要求不高的场景,就可以将RTO的计算设计比较小,这样能尽最大可能保证你的延时足够小。例如:实时操作类网游、教育领域的书写同步,是典型的用expense换latency和Quality的场景,适合用于小带宽低延迟传输。如果是大带宽实时传输,定时重传对带宽的消耗是很大的,极端情况会用20%的重复重传率,所以在大带宽模式下一般会采用请求重传模式。

请求重传

请求重传就是接收端在发送ACK的时候携带自己丢失报文的信息反馈,发送端接收到ACK信息时根据丢包反馈进行报文重传。

2020一线互联网大厂秋招提前批的面试经验_第2张图片

这个反馈过程最关键的步骤就是回送ACK的时候应该携带哪些丢失报文的信息,因为UDP在网络传输过程中会乱序会抖动,接收端在通信的过程中要评估网络的jitter time,也就是rtt_var(RTT方差值),当发现丢包的时候记录一个时刻t1,当t1+Rtt_var< curr_t(当前时刻),我们就认为它丢失了,这个时候后续的ACK就需要携带这个丢包信息并更新丢包时刻t2,后续持续扫描丢包队列,如果他t2 +RTO。

FEC选择重传

除了定时重传和请求重传模式以外,还有一种方式就是以FEC分组方式选择重传,FEC(Forward Error Correction)是一种前向纠错技术,一般是通过XOR类似的算法来实现,也有多层的EC算法和raptor涌泉码技术,其实是一个解方程的过程。应用到RUDP上示意图如下:

2020一线互联网大厂秋招提前批的面试经验_第3张图片

在发送方发送报文的时候,会根据FEC方式把几个报文进行FEC分组,通过XOR的方式得到若干个冗余包,然后一起发往接收端,如果接收端发现丢包但能通过FEC分组算法还原,就不向发送端请求重传,如果分组内包是不能进行FEC恢复的,就请求想发送端请求原始的数据包。FEC分组方式适合解决要求延时敏感且随机丢包的传输场景,在一个带宽不是很充裕的传输条件下,FEC会增加多余的冗余包,可能会使得网络更加不好。FEC方式不仅可以配合请求重传模式,也可以配合定时重传模式。

在默认状态下,QQ优先采用了UDP(User Data Protocol,用户数据报协议)协议传送数据,而对可靠性要求高的数据通讯系统往往使用TCP协议传输数据。与TCP协议不同,UDP协议并不提供数据传送的验证机制——在整个文件传输过程中如果出现数据报的丢失,协议本身并不能作出任何的检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。 UDP协议适用于无须应答、要求时效的软件使用,这样的设计正好与QQ追求的目标相符,所以QQ优先使用了此协议进行一切功能应用。但是,由于UDP协议具有不可靠性,常会因种种原因导致消息或数据的发送失败(很多时候会发现发送文件给对方接收时,对方根本收不到要求接收文件的消息。或是发送聊天消息时,对方根本没有收到过消息)。显然,UDP协议由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。QQ在数据传输上更注重实际性能,为了获得更好的使用效果,往往可以牺牲一定的可靠性。因此,使用QQ来传输数据,在很多时候就成了一个“不错”的选择。

5 生产者消息发送Kafka一直失败。

原因:Kafka中的比如Master挂了,在重新选举Master的情况。或者是网络抖动的原因。

6 CPU的缓存架构

 

7 一个数字的开方算法

8 eurake的单点故障怎么处理

9 Redis的通信原理是什么样的?

10 动态规划和贪心问题的算法

11 链表和树的的相关的一个

12 无序单链表的排序,不能使用其他其他的算法。

13 一致性hash算法原理

14JDK中常见的包有哪些?源码是什么?

15 两个数组找到第k大的数组 不能使用的其他内存

16 不能使用的其他的数据结构 使用的无序链表有序。

17长轮询和短轮询的的实现原理?

 

18http连接的详细过程

2020一线互联网大厂秋招提前批的面试经验_第4张图片

 

你可能感兴趣的:(实际面试问题和答案解答,java)