美团-暑期实习-流程架构-二面面经
问题记录
数据库
分布式系统怎么保证系统的一致性?
执行层:乐观执行,保存历史版本信息,冲突之后,重做。
存储层:日志文件,进行恢复
分布式课程学过吗,CAP是什么
学过,还看过MIT的6.824。
CAP,它其实是提出了一种理论思想,也就是说在一个分布式系统里的话,同时达成 CAP 这三个特性是基本上不可能完成的。 c 的话就是一致性,系统节点他们所处的状态和记录需要达成一致的, a 的话是可用,提供的服务是可以对外是一直可用的。然后 p 的话就是partition,也就是说进行相关的分区管理来提高一定的性能。然后现在的分布式系统的话,基本上都会在这三个中间进行相关的权衡来实践,嗯,可能是 CA 或者是 AP 相关的系统,然后基于此的话,业界其实还有一个基于 CAP 理论的实践的一个方式,其实是BASE,也就是说,可以实现一个基本可用。然后 s 的话是一个软状态, e 对应最终一致性来达成这个实际上分布式系统的实践。
有哪些CA的系统,HBase属于什么?
Hbase 的话它肯定是首先满足了一致性的要求,然后,嗯,到底是 available 还是 partiition 的话,我这个不太清楚。
用过哪些分布式系统?
hadoop,spark这两个大数据环境下的分布式系统。然后一般来说的话,我可能嗯主要研究的分布式系统偏底层一点,比如说像TiKV 或者是一些其他的数据库,他提供了相关的分布式扩展。
有看过TiKV的源码吗?
这倒没有,但是看过 LevelDB 的源码。
对比来说TiKV有什么优点?
这个我可能了解不多。TiKV 的话,它是一个开源的数据库,PingCAP的一个产品,所以说它其实在业界的数据库实现方面还是比较领先的,但是实际使用的社区生态做得挺好。
LSMTree是个怎么样的存储结构
多棵修改树的结构,带了一点冷热分离性质。memtable轮换记录写入的操作,放入层级树中。越上面的层级是越新的数据,然后越下面的层级的话是旧的数据,所以说在这个方面的话就能实现一定的快照读这样子的情况来避免一定的读写并发,加快写的效率。然后,经过这样的层级数据累积之后的话,会通过 compaction 的过程来将各层级之间的一些数据文件进行相关的合并,然后到下一层一直到磁盘文件去除数据的冗余,越下层的数据越多。
为什么用MongoDB不用ES
ES确实更好,我们后续优化打算换成ES
Redis和Memcache有什么区别
Memcache不能持久化数据,Redis可以,它提供了两种持久化的功能,像 AOF 和 RDB。而且Redis的性能更快。
GO
goroutine
goroutine 的话,它其实是用户态的轻量级的线程,就是如果在操作系统里的话,它其实可以叫做协程,所以说它相比于线程和进程来说的话,它其实切换上下文切换的代价会更低一些,能够支持这种高并发场景下的使用。
一个 goroutine 它的大小的话大概是 KB 级别的,所以说它其实能够支持在同一时间支持几千条调度和并发。
底层调度,基本上是基于 GMP 模型来实现,同时他还可以被多路复用,当前这个线程进行相关的堵塞之后,可以有另外一个线程进行相关的抢占,来执行,这也是他快的一个方面。
协程跟线程
线程的话它也它相比进程来说的话,它其实确实是量级更小一点。然后至于他们的大小来说的话,协程也是比线程要小的,因为协程里面的话基本上只会包含他切换的时候他的那个上下文地址,以及相关要执行的程序的信息。然后如果当一个执行成功,协程执行完之后的话,直接就会跟根据他那个上下文的地址切换回去就可以了。而进程之间的话会进行相关的 CPU 的调度,开销会大很多。
线程是用户级的还是内核级的,协程呢?
用户级,用户级
算法
跳台阶+全排列
反问
- 实习生培养;Java学习
查看5道真题和解析