一、字节提前批 java 后端一面
1.1 你说你用了 RPC 远程调用,讲讲原理是怎么样的
RPC(Remote Procedure Call)远程调用,通过某种手段,协议,约定调用非本地服务
RPC 框架作为架构微服务化的基础组件,它能大大降低架构微服务化的成本,提高调用方与服务提供方的研发效率,屏蔽跨进程调用函数(服务)的各类复杂细节。让调用方感觉就像调用本地函数一样调用远端函数、让服务提供方感觉就像实现一个本地函数一样来实现服务
1.2 讲一下网络间是如何通信的,具体一些,用刚才你说的 rpc 具体说明以下
1.1 怎么做到透明化远程服务调用?
对java来说就是使用代理!java代理有两种方式:1) jdk 动态代理;2)字节码生成
1.2 怎么对消息进行编码和解码?
客户端请求:接口名称+方法名+参数类型&参数值+超时时间+requestID 【序列化,反序列化】
1.3通信
java的两种通信模式,BIO NIO
1)使用java nio方式自研,这种方式较为复杂,而且很有可能出现隐藏bug,见过一些互联网公司使用这种方式;
2)基于mina,mina在早几年比较火热,不过这些年版本更新缓慢;
3)基于netty,现在很多RPC框架都直接基于netty这一IO通信框架,比如阿里巴巴的HSF、dubbo,Twitter的finagle等
1.3 http 和 rpc 有什么区别呢?
RPC远程过程调用,是能够远程调用到我们用到的服务,给远程服务下命令,帮助我们去做某一件事情,可以用各种方式去实现,可以是socket 可以是http,可以是webservice
1、传输协议
RPC,可以基于TCP协议,也可以基于HTTP协议
HTTP,基于HTTP协议
2、传输效率
RPC,使⽤用⾃自定义的TCP协议,可以让请求报⽂文体积更更⼩小,或者使⽤用HTTP2协议,也可以很好的减少报⽂文的体积,提⾼高传输效率
HTTP,如果是基于HTTP1.1的协议,请求中会包含很多⽆无⽤用的内容,如果是基于HTTP2.0,那么简单的封装以下是可以作为⼀一个RPC来使⽤用的,这时标准RPC框架更更多的是服务治理理
3、性能消耗
RPC,,主要在于序列列化和反序列列化的耗时 可以基于thrift实现⾼高效的⼆二进制传输
HTTP,⼤大部分是通过json来实现的,字节⼤大⼩小和序列列化耗时都⽐比thrift要更更消耗性能
4、负载均衡
RPC,基本都⾃自带了了负载均衡策略略
HTTP,需要配置Nginx,HAProxy来实现
5、服务治理(下游服务新增,重启,下线时如何不不影响上游调⽤用者)
RPC,能做到⾃自动通知,不不影响上游
HTTP,需要事先通知,修改Nginx/HAProxy配置
RPC主要⽤用于公司内部的服务调⽤用,性能消耗低,传输效率⾼高,服务治理理⽅方便便。HTTP主要⽤用于对外的异构环境,浏览器器接⼝口调⽤用,APP接⼝口调⽤用,第三⽅方接⼝口调⽤用等。
1.4 除了 RPC、HTTP 还用过哪些通信协议
TCP HTTP UDP
1.5 websocket 原理是什么
WebSocket是HTML5下一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。它与HTTP一样通过已建立的TCP连接来传输数据,但是它和HTTP最大不同是:
1.WebSocket是一种双向通信协议。在建立连接后,WebSocket服务器端和客户端都能主动向对方发送或接收数据,就像Socket一样
2.WebSocket需要像TCP一样,先建立连接,连接成功后才能相互通信
3.HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低
1.6 用了 Mysql 是吧,讲讲Mysql 的数据结构
1.7 B 树和B+ 树有什么区别? 简单,讲一讲聚簇索引九好
1.8 主键索引在 B+ 树上怎么存储的?
1.innodb中的B+树,非叶子节点主要是存储主键的记录值,按照主键的大小顺序排成一个单向链表。
2.叶子节点是存放用户数据的,页内数据根据用户记录的主键大小排列成的单向链表。而页和页之间是根据主键大小顺序排成一个双向链表
1.9 B+ 树的页存了什么东西,叶子结点上的存了什么东西?
1.10 你说B + 树有聚簇索引,那聚簇索引上数据具体是怎么存储的
1.11 有这么一个联合索引:bcd,下面的查询有什么区别?效率如何
select a,b,c where b=1 and c=1 and d=1;
select b,c,d where b=1 and c=1 and d=1;
select b,c,d where b=1 and c=1&nbs***bsp;d=1;
算法题(30 min)牛客网视频
机器人左上角走到右下几种走法
二、字节提前批二面 后端开发 抖音
1、自我介绍
2、僵尸进程、孤儿进程
僵尸进程:当一个进程退出时,他并不是完全消失,而是等到它的符进程发出wait系统调用才会完全消失,除非父进程发出wait系统调用终止进程,否则该进程一直处于僵死状态,等待父进程终止它。
实际上,僵尸进程已经死了,它要向父进程返回一个退出状态,报告死讯
孤儿进程:如果父进程比子进程先死的话,子进程就变成孤儿进程了,这时候孤儿进程就被in(进程号为1)进程领养。并由init进程对他们完成状态收集工作。
3、IO多路复用,IO多路复用的三种实现方式
IO多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄;
select poll epoll
4、epoll有哪两种触发方式,tcp应该用哪种触发方式
(水平触发):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读,如果这次没有把数据一次性全部读写完(如读写缓冲区太小),那么下次调用 epoll_wait()时,它还会通知你在上次没读写完的文件描述符上继续读写,
(边缘触发):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写,如果这次没有把数据全部读写完(如读写缓冲区太小),那么下次调用epoll_wait()时,它不会通知你,也就是它只会通知你一次,直到该文件描述符上出现第二次可读写事件才会通知你
条件触发条件触发方式中,只要输入缓冲中有数据就会一直通知该事件。
select和epoll默认以条件触发方式工作。
边缘触发输入缓冲收到数据时,仅注册一次该事件,即使缓冲中还有数据,也不会再进行注册。
5、TCP怎么保证可靠传输
超时重传:tcp发送端发送数据后会启动一个计时器,当计时器超过某个时间没有收到接收端的确认就,重新发送数据。
确认:tcp接收端接收到数据后发送确认给发送端。
校验:tcp接收到数据检验发现数据有误,丢弃报文段,不给出相应,发送端会超时重传
失序重排:tcp是用ip数据报传送数据的,ip数据报到达会失序,因此数据到达也会失序。Tcp会对失序的数据重新排列。
重复丢弃:对收到的重复数据丢弃掉。
流量控制:当接收端来不及处理发送端发送的数据,能提示发送端降低发送的速率,防止包丢失。
拥塞控制:当网络拥塞时,减少数据的发送。
6、TCP窗口大小,如果拥塞控制和接收缓冲区控制窗口不一样,应该选哪个
7、应用层send一个数据成功了,发送方应用程序怎么感知到自己发送成功了,是应用层还是传输层做
TCP是可靠的数据连接,send过去的数据,一定会被对方接收到,除非连接断开。
TCP和上层应用之间是网络层和应用层之间的关系,TCP收到的ACK只能表明对端TCP收到了相应的数据在内核缓存中,对端应用是否读取到了这条消息,是不能判断的
8、TCP里的keepalive(心跳机制)了解吗
在TCP中有一个Keep-Alive的机制可以检测死连接,应用层如果对于死链接周期不敏感或者没有实现心跳机制,可以使用操作系统提供的keepalive机制来踢掉死链接
正常情况下客户端中断TCP连接时,会发送一个FIN包,进行4次断开握手来通知服务器。但一些异常情况下,如客户端突然断电断网或者网络异常,服务器可能无法得知客户端已断开连接。
尤其是移动网络,TCP连接非常不稳定,所以需要一套机制来保证服务器和客户端之间连接的有效性
TCP自带的KeepAlive使用简单,发送的数据包相比应用层心跳检测包更小,仅提供检测连接功能
应用层心跳包不依赖于传输层协议,无论传输层协议是TCP还是UDP都可以用
HTTP协议的Keep-Alive意图在于连接复用,同一个连接上串行方式传递请求-响应数据
TCP的KeepAlive机制意图在于保活、心跳,检测连接错误
9、HTTP的keepalive了解吗
HTTP协议简介中提到http协议是一个运行在TCP协议之上的无状态的应用层协议。它的特点是:客户端的每一次请求都要和服务端创建TCP连接,服务器响应后,断开TCP连接。下次客户端再有请求,则重新建立连接。
在早期的http1.0中,默认就是上述介绍的这种“请求-应答”模式。这种方式频繁的创建连接和销毁连接无疑是有一定性能损耗的。
所以引入了keep-alive机制。http1.0默认是关闭的,通过http请求头设置“connection: keep-alive”进行开启;http1.1中默认开启,通过http请求头设置“connection: close”关闭。
10、HTTP2.0和1.1有什么区别
HTTP/2采用二进制格式而非文本格式
HTTP/2是完全多路复用的,而非有序并阻塞的——只需一个连接即可实现并行
使用报头压缩,HTTP/2降低了开销
HTTP/2让服务器可以将响应主动“推送”到客户端缓存中
11、2.0的多路复用实现原理
12、thrift的IDL,兼容性检查,修改的时候要注意什么
13、redis有几种数据类型
14、redis主从复制说一下
15、全量同步的时候,如果复制缓冲区写满了怎么解决
16、当master死亡后,新的slave竞选成为master后会触发全量复制吗,如何进行同步
17、算法:1143. 最长公共子序列
三、8.3 字节国际化电商一面 北京
1. 自我介绍
2. 项目难点,分布式锁,Redis和zookeeper的实现方式和优缺点,怎么选择
3. Mysql:Innodb和MYISM区别,聚簇索引和非聚簇索引,为什么用B+树,redolog和undolog
4. Redis:持久化机制,SDS和快表
5. 网络:HTTPS加密流程,TIME_WAIT状态,为什么等待2MSL,状态码500和502区别
5xx(服务器错误)
这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
代码 说明
500 (服务器内部错误) 服务器遇到错误,无法完成请求。
501 (尚未实施) 服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
6. 操作系统:分页,分段,段页解决了什么问题,介绍一下虚拟内存
分区式内存管理:将整个程序一次性加载到内存的一个区域中。会产生区外无法利用的外部碎片。
分页式内存管理:将内存分成固定大小的页,一般是4k,将程序按页分切割。分配给程序的页可以物理上不连续,不会产生外部碎片,但是最后一个页的4k不一定用的完,就会产生内部碎片。
分段式内存管理:将程序按照数据段和代码段在不同的安全级别上进行划分若干段,每一段分配连续的物理内存。
段页式内存管理:在分段式的基础上,对每一段进行分页,使物理地址离散。
上述内存访问都是进程全部加载到内存中。。。
请求式分页和虚拟内存:请求式分页式将进程放到虚拟内存中,由于程序的局部性原理,只需要将用到的页面调入物理内存。
概括:
分页式:提高了内存利用率
分段式:便于管理员/编译器对内存进行管理
段页式:结合上述两种方式的优点
7. 算法:数组a,先递增再递减,输出数组中不同元素个数。要求:O(1)空间复杂度,尽可能小的时间复杂度,不能改变原数组。 如arr=1,2,4,6,8,3,2,2 输出6
三、字节-国际化电商-后端Java二面面经
1.计算机网络主要解决什么问题的?
2.TCP/IP协议栈和OSI五层模型,他们的区别是啥,为什么要划分这两个标准(心态已经有点炸)
OSI的七层协议主要包括:物理层、数据链路层、网络层、运输层、会话层、表示层、应用层)。
OSI五层协议结构是综合了OSI和TCP/IP的优点的一种协议,包括(从下到上):物理层、数据链路层、网络层、运输层、应用层。
3.TCP主要解决什么问题,我说 IP层不保证可靠,需要靠TCP来保证
4.什么叫做可靠?怎么保证可靠的,然后我说了一堆,面试官:概括一下:
大概就是序号、滑动窗口、流量控制、拥赛控制、确认重传机制
5.说说慢开始算法吧?
当主机开始发送数据时,如果立即把大量数据字节注入到网络中,那么久有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。经验证明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。
通常在刚刚开始发送报文段时,先把拥塞窗口cwnd设置为一个最大报文段MSS数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加之多一个MSS的数值,用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理
6.Socket三元组是怎么保证传输到对方的,怎么回来的?
int socket(int domain, int type, int protocol);
7.怎么获取到ip的?DNS,怎么获取到下一跳的ip地址的?
1.查看浏览器内部缓存
2.系统缓存
3.路由器缓存、ISP 缓存
4.本地 DNS 服务器
5.域名服务器 : 根域服务器 -> 顶级域名服务器-> 主域名服务器
Ospf或者其他协议,维护路由表
8.期间我说了mac地址?怎么获取到mac地址的?APR,mac地址表
9.如果说一个主机在局域网内怎么传输的?讲了讲NAT的原理
10.说说三次握手吧?如果发送方接收方同时发送SYN请求报文,那么是一次连接还是两次连接?
11.我说两次,肯定吗?可以从接收方和发送方的状态来考虑?这个问题请大佬回答啊我一开始说的是两次连接因为因为每次连接的序号都是随机的互不影响,但是状态的话都会变到SYN SEND啊,如果在TCP里面会去判断状态的话,那就是一次
12.TCP的保活机制了解吧?发个探测报文,能说的具体点嘛?没操作过
13.为什么有了TCP的保活机制还要有应用层的保活机制?两者的区别知道吗?不太懂,我说HTTP具备保活机制,但是其他的应用层协议也许就没有了,所以还要有TCP的保活机制?他说不对?
14.你知道CICD嘛?我忘记问的啥了?我说是持续部署持续集成的那个CICD嘛,他说不是,然后反问你不是在xxx实习嘛?这个云技术很重要的,我说可能部门的侧重点不一样,我在这做数据库的
15.那你说说说TCP四次挥手的几个状态吧?那么为什么TIME_WAIT的时间是2MSL呢?
第一次挥手 当客户端的数据都传输完成后,客户端向服务端发出连接释放报文,需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据。
第二次挥手 服务端收到客户端发的FIN报文后给客户端回复确认报文,此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。
第三次挥手 服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文
第四次挥手 客户端收到服务端发的FIN报文后,向服务端发出确认报文,服务端一旦收到客户端发出的确认报文就会立马释放TCP连接。
MSL是TCP报文的最大生命周期,因为TIME_WAIT持续在2MSL就可以保证在两个传输方向上的尚未接收到或者迟到的报文段已经消失,否则服务器立即重启,可能会收到来自上一个进程迟到的数据,但是这种数据很可能是错误的,同时也是在理论上保证最后一个报文可靠到达,假设最后一个ACK丢失,那么服务器会再重发一个FIN,这是虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK
16.那如果发送方和接收方同时发送FIN报文呢?会怎么样?我小声嘀咕了一下同时发送会同时到达嘛 请大佬回答
17.那你知道TCP的保活机制的缺点吗?我说不了解,但是我现在知道了为什么要有应用层的保活机制,面试官笑了两声,然后给我说对的,技术就是这样的,我也笑了
18.那你说说三次握手嘛,它的状态是怎么变化的?
19.对计算网络你还有那块比较熟悉吗?我说这个不敢说熟悉,肯定还会有不知道的点,面试官又笑了两声
20.那再问一个问题吧,你还有什么课程比较熟悉吗?操作系统,行那你说说LInux的负载指数是怎么呀的?我说就是那个top下来有一个指标,这个忘记了啊
21.说说你的实习吧?
22.你有什么要问的吗?我说我没有。。。你对你今天的表现怎么样?
我说不是很好,不能只是停留在理论吧啦吧啦我说了一点,然后我反问他:请问您刚才提到的问题,发送方和接收方同时发送SYN报文,怎么去模拟这个场景?对方:沉默20秒,模拟还是能模拟的吗?哈哈,那今天就到这
然后你接下来把那个题完成吧,我抽空回看看的,然后花了点时间写了下链表。结束了