阿里-阿里妈妈-Java
1、mysql中myism和innodb的区别
myisam不支持事务,innodb支持事务
myisam只支持表锁,innodb支持表锁和行锁
myisam支持全文检索,innodb不支持全文检索
2、聚簇索引和非聚簇索引区别
聚簇索引:将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据
非聚簇索引:将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置
3、jvm内存模型以及程序运行时,它们是怎么一个过程
方法区
程序计数器
堆
本地方法栈
虚拟机栈
4、jvm跨代引用是如何处理的
5、双亲委派机制的优点
6、消息中间件里的消息重复、乱序、丢失,请从生产者和消费者的角度去谈一谈
可以看出,保证消息的可靠性需要三方配合。
生产者需要处理好Broker的响应,出错情况下利用重试、报警等手段。
Broker需要控制响应的时机,单机情况下是消息刷盘后返回响应,集群多副本情况下,即发送至两个副本及以上的情况下再返回响应。
消费者需要在执行完真正的业务逻辑之后再返回响应给Broker。
但是要注意消息可靠性增强了,性能就下降了,等待消息刷盘、多副本同步后返回都会影响性能。因此还是看业务,例如日志的传输可能丢那么一两条关系不大,因此没必要等消息刷盘再响应。
如果处理重复消息
我们先来看看能不能避免消息的重复。
假设我们发送消息,就管发,不管Broker的响应,那么我们发往Broker是不会重复的。
但是一般情况我们是不允许这样的,这样消息就完全不可靠了,我们的基本需求是消息至少得发到Broker上,那就得等Broker的响应,那么就可能存在Broker已经写入了,当时响应由于网络原因生产者没有收到,然后生产者又重发了一次,此时消息就重复了。
再看消费者消费的时候,假设我们消费者拿到消息消费了,业务逻辑已经走完了,事务提交了,此时需要更新Consumer offset了,然后这个消费者挂了,另一个消费者顶上,此时Consumer offset还没更新,于是又拿到刚才那条消息,业务又被执行了一遍。于是消息又重复了。
可以看到正常业务而言消息重复是不可避免的,因此我们只能从另一个角度来解决重复消息的问题。
关键点就是幂等。既然我们不能防止重复消息的产生,那么我们只能在业务上处理重复消息所带来的影响。
幂等处理重复消息
幂等是数学上的概念,我们就理解为同样的参数多次调用同一个接口和调用一次产生的结果是一致的。
例如这条 SQLupdate t1 set money = 150 where id = 1 and money = 100; 执行多少遍money都是150,这就叫幂等。
因此需要改造业务处理逻辑,使得在重复消息的情况下也不会影响最终的结果。
可以通过上面我那条 SQL 一样,做了个前置条件判断,即money = 100情况,并且直接修改,更通用的是做个version即版本号控制,对比消息中的版本号和数据库中的版本号。
或者通过数据库的约束例如唯一键,例如insert into update on duplicate key...。
或者记录关键的key,比如处理订单这种,记录订单ID,假如有重复的消息过来,先判断下这个ID是否已经被处理过了,如果没处理再进行下一步。当然也可以用全局唯一ID等等。
基本上就这么几个套路,真正应用到实际中还是得看具体业务细节。
如何保证消息的有序性
有序性分:全局有序和部分有序。
全局有序
如果要保证消息的全局有序,首先只能由一个生产者往Topic发送消息,并且一个Topic内部只能有一个队列(分区)。消费者也必须是单线程消费这个队列。这样的消息就是全局有序的!
不过一般情况下我们都不需要全局有序,即使是同步MySQL Binlog也只需要保证单表消息有序即可。
部分有序
因此绝大部分的有序需求是部分有序,部分有序我们就可以将Topic内部划分成我们需要的队列数,把消息通过特定的策略发往固定的队列中,然后每个队列对应一个单线程处理的消费者。这样即完成了部分有序的需求,又可以通过队列数量的并发来提高消息处理效率。
图中我画了多个生产者,一个生产者也可以,只要同类消息发往指定的队列即可。
如果处理消息堆积
消息的堆积往往是因为生产者的生产速度与消费者的消费速度不匹配。有可能是因为消息消费失败反复重试造成的,也有可能就是消费者消费能力弱,渐渐地消息就积压了。
因此我们需要先定位消费慢的原因,如果是bug则处理 bug ,如果是因为本身消费能力较弱,我们可以优化下消费逻辑,比如之前是一条一条消息消费处理的,这次我们批量处理,比如数据库的插入,一条一条插和批量插效率是不一样的。
假如逻辑我们已经都优化了,但还是慢,那就得考虑水平扩容了,增加Topic的队列数和消费者数量,注意队列数一定要增加,不然新增加的消费者是没东西消费的。一个Topic中,一个队列只会分配给一个消费者。
当然你消费者内部是单线程还是多线程消费那看具体场景。不过要注意上面提高的消息丢失的问题,如果你是将接受到的消息写入内存队列之后,然后就返回响应给Broker,然后多线程向内存队列消费消息,假设此时消费者宕机了,内存队列里面还未消费的消息也就丢了
7、k8s的设计理念,源码是否看过,谈一谈这样架构的好处
8、程序计数器是如何工作的
9、volatile是干啥的?其中线
10、结合类加载和jvm内存模型说一下整个过程
11、了解那些数据库的索引数据结构?分别说说有什么好处?
12、微服务拆分的原则?优缺点?
13、启动三个线程实现顺序打印abc
14、动态代理的原理
15、容器了解多少?为什么k8s的设计里有pod,而不是直接用容器?
16、高并发场景下,有10台机器正在工作,其中有一台机器重启之后cpu load特别大,请从各个角度分析一下该现象出现的原因
17、如何用AQS实现一个锁
阿里-新零售-Java
阿里巴巴一面(55分钟)
先介绍一下自己吧
说一下自己的优缺点
具体讲一下之前做过的项目
你觉得项目里给里最大的挑战是什么?
Hashmap为什么不用平衡树?
AQS知道吗?知道哪一些呢?讲一讲。
CLH同步队列是怎么实现非公平和公平的?
ReetrantLock和synchronized的区别
讲一下JVM的内存结构
JVM 里 new 对象时,堆会发生抢占吗?你是怎么去设计JVM的堆的线程安全的?
讲一下redis的数据结构
redis缓存同步问题
讲一讲MySQL的索引结构
你有什么问题要问我吗?
阿里巴巴二面(45分钟)
根据项目问了一些细节问题
说一下HashMap的数据结构
红黑树和AVL树有什么区别?
如何才能得到一个线程安全的HashMap?
讲一下JVM常用垃圾回收期
redis分布式锁
再描述一下你之前的项目吧
你觉得这个项目的亮点在哪里呢?
你设计的数据库遵循的范式?
你有没有问题?
阿里巴巴三面(50分钟)
又聊项目
在项目中,并发量大的情况下,如何才能够保证数据的一致性?
elasticsearch为什么检索快,它的底层数据结构是怎么样的?
JVM内存模型
netty应用在哪些中间件和框架中呢?
线程池的参数
讲一下B树和B+树的区别
为什么要用redis做缓存?
了解Springboot吗?那讲一下Springboot的启动流程吧
如何解决bean的循环依赖问题?
Java有哪些队列?
讲一讲Spring和Springboot的区别
最近看了什么书?为什么?
你平时是怎么学习Java的呢?
阿里-阿里口碑-Java
阿里巴巴一面(38分钟)- 自我介绍
介绍项目, 具体一点
讲一下Redis分布式锁的实现
HashMap了解么吗?说一下put方法过程
HashMap是不是线程安全?
ConcurrentHashMap如何保证线程安全?
数据库索引了解吗?讲一下
常见排序算法
TCP三次握手,四次挥手。
深入问了乐观锁,悲观锁及其实现。
阿里巴巴二面(45分钟)
自我介绍+项目介绍
你在项目中担任什么样的角色?
那你觉得你比别人的优势在哪里?你用了哪些别人没有的东西吗?
Java怎么加载类?
linux常用命令有哪些?
Spring的IOC, AOP。
讲一下ORM框架Hibernate
设计模式了解吗?讲一下
自己实现一个二阶段提交,如何设计?
你还有什么想问的?
阿里巴巴三面(30分钟)
说一下自己做的项目
问了一些项目相关的问题
wait()和sleep()的区别
原子变量的实现原理
CAS的问题,讲一下解决方案。
有没有更好的计数器解决策略
讲一讲NIO和BIO的区别
Nginx负载均衡时是如何判断某个节点挂掉了?
讲一下redis的数据类型和使用场景
k8s的储存方式是怎样的?
Spring AOP原理是什么?怎么使用?什么是切点,什么是切面?最好是举个例子
算法题:给一堆硬币的array,返回所有的组合
阿里巴巴总监面(34分钟)
算法:给一个set打印出所有子集;多线程从多个文件中读入数据,写到同一个文件中;判断ip是否在给定范围内;打乱一副扑克牌,不能用额外空间,证明为什么是随机的。
Tcp和udp区别
线程池的原理以及各种线程池的应用场景
线程池中使用有限的阻塞队列和无限的阻塞队列的区别
如果你发现你的sql语句始终走另一个索引,但是你希望它走你想要的索引,怎么办?
mysql执行计划
数据库索引为什么用b+树?
你在做sql优化主要从哪几个方面做,用到哪些方法工具?
有没有想问的?
阿里巴巴HR面(23分钟)
自我介绍
平时怎么学习的?
有什么兴趣爱好吗?
怎么看待996?
怎么平衡工作和学习?
有没有什么想问的
阿里-阿里云-Java
一面:
项目介绍
字符串全排列
线程安全
设计题:设计一个微博系统,给了一个比较大的用户量
头条-后端 一面
1.介绍了一下做过的项目架构,和项目实现细节。面试官最近刚做了一个项目,跟我们做的项目一样,聊了比较久
2.看我之前是打acm的,说问道简单的算法题走个流程Orz。
题:一个先逆序再正序的数组,求最小值
5 4 3 2 1 2 3 返回 1
解法:二分
3.看我项目里有一个进程内缓存的项目,聊了一下,然后又问了concurrentmap和hashmap区别,concurrentmap的分段锁,最多支持多少个segment
二面
1.聊项目,聊了比较久
2.问了一到算法题,二叉树按中序遍历的方式转换为链表
解法:中序遍历,遍历的时候修改树节点的前后指针。需要用到一个辅助节点pre和一个节点记录链表头
三面
1.问了一个开放性题目,设计一个方案,根据用户地点返回附近的餐馆
按城市划分,将城市划分为网格,每个网格有不同的餐馆,先定位到用户在哪个网格,再获取周围网格中的餐馆
2.算法题:将一个字符串小数约分为分数,且分子分母约分过,需要考虑无限循环小数
1.15(3) 表示1.153333333333循环
解法:分三部分,整数部分,非循环的小数和循环的小数
非循环部分的小数变分数为x/10^n
循环部分小数变分数为y/10^n(10^m-1)
如上述例子中循环部分为 3/ 100*9
整数部分直接加上分数
约分使用欧几里得算分子分母最大公约数,再除一下即可
二叉搜索数第k大元素。
二叉树按层遍历。
堆排序。
topk。
两个set取交集
链表是否有环。如何找到入环节点
头条-后端
一面:
1.项目。
2.Reentranlock 与synchronized区别。 各自的底层实现
3.事务隔离级别。 innodb的默认隔离级别如何避免幻读?
5. mvcc。快照读 当前读。
6. jvm cms的步骤。 缺点。
7. 有大量full gc如何排查?
8. 堆 gc频次正常 时间正常。 出现内存泄漏是什么问题? 如何排查堆外内存? 你见过哪里用堆外内存?
9. netty eventloop 大概做什么? io事件 读写事件。任务事件
10. 任务事件中 如何保障多线程情况下线程安全的进行上层的writeAndFlush? mpsc队列
4.实现一个 LRU ? get为o(1)复杂度
二面。
1项目中 难点。讲两个
2. 如何实现一个可靠传输? 序列号。校验和 重传 ack 滑动窗口。拥塞控制。等
3. mysql架构。 sql经过解析器之后得到的解析树 如何转换成优化器的执行计划?如何选择?
4. b+tree结构?索引的页分裂?innodb做了哪些避免页分裂的努力?都是从节点中间记录分裂吗?
5. 辅助索引 一个范围查询。 如果当前值不在索引中。如何查处符合条件的记录的?
6. innodb的特性? 自适应hash。聚簇索引。 insert buffer?
7. 可靠传输一定需要建立连接吗?
8. 双向链表消除相处重复的? 消除之后新链接在一起的仍相同继续删除。算法题 手写
9. 数组中 指定元素值的最小下标。 如何最优?二分查找中继续二分查找 手写
10. 红黑树特性?二叉搜索数第k大元素。 然后继续topk算法。 除了小跟堆之外。问还有别的呢? 基于快排思想的top k手写。
三面。
1.项目
2.kafka的传递保证
3. 一次遍历打印出 二叉树的最大深度和最大宽度 (同层中节点个数最大值)
4. 如何删除倒数第k节点
5. 聊以后发展
头条-后端
一面:
1. 项目介绍 20分钟
2. mysql索引 优缺点 底层实现原理
3. mysql的优化。 不限于sql优化
4. mysql join原理
5. tcp协议 如何保障可靠传输
6. MTU是什么? MSL呢
7. redis zset实现原理
8. rdb 和 aof区别
9. redis的主从同步原理
10. 二叉树的后序遍历
11. 二叉树按层打印
12. 括号的有效组合
二面
1. 项目介绍
2. tcp udp区别。头部字节有哪些。多少字节
3. 通过域名是如何从外网请求到你公司内网服务器的? 详细讲解一下
4. 路由算法
5. 当前路由到某一个节点,如何查找选择的下一个节点?
6. ip 分几类? 如何划分的?
7. tcptrace 请求一个目标ip。会把路由的所有节点ip打印出。是如何做到的?
8. 最长回文子字符串
9. 反转链表 递归。非递归