阿里面试第五弹(完结)

259 阅读4分钟

分布式

1.分布式事务解决方案?

①TCC补偿性事务

②saga

③基于MQ的事务异步确保型,需要业务系统结合MQ消息中间件实现,在实现过程中需要保证消息的成功发送及成功消费。即需要通过业务系统控制MQ的消息状态

④最大努力通知型,这种方案主要用在与第三方系统通讯时,比如:调用微信或支付宝支付后的支付结果通知。达到通知次数后即不再通知。

⑤2PC

⑥3PC

2.redis 热key如何解决?

①利用jvm堆内缓存,如HashMap等

②通过集群分担负载。

3.什么是缓存穿透,如何解决?

缓存穿透是指查询一个缓存和数据库都不存在的数据,造成数据库压力增大

解决方案:

①缓存空对象.将 null变成一个特定值.②布隆过滤

4.常用的限流算法有哪些?

①令牌桶②漏桶③滑动窗口④计数器

5.聊聊web集群与高可用方案?

集群主要考虑session解决方案:

①基于Cookie的Session共享。把session加密后存在cookie中,每次session信息被写在客服端.然后经浏览器再次提交到服务器

②提供一个群集保存session共享信息。应用统统把自己的session信息存放到session群集服务器组.当应用系统需要session信息的时候直接到session群集服务器上读取。

③同步session。利用服务器资深功能进行session复制,达到每个服务器上的都有相同的session。

高可用主要考虑使用:

keepalived, haproxy,lvs.nginx等软件实现主备切换⑤异地多活

协议

1.现代浏览器在与服务器建立了—个TCP连接后是否会在一个HTTP请求完成后断开?

①默认情况下建立TCP连接不会断开,只有在请求报头中声明Connection: close 才会在请求完成后关闭连接;②但需注意早期的HTTP1.0协议规定是要断开,而服务器供应商一般都是支持不断开

2.TCP两端A、B建立了连接后,如果一端拔掉网线或者拔掉电源,另一端能够收到通知吗,如何解决?

不能,原因如下;

①TCP是一种有连接的协议,但是这个连接并不是指有一条实际的电路,而是一种虚拟的电路。TCP两端的操作系统用一种数据结构保存了数据的状态,就代表这种连接,因此如果不发送数据通知对方删除这种数据状态,是无法断开连接的。解决方案:

②TCP本身的KEEP_ALIVE

③应用层心跳

Mysql数据库

1.举例说明什么是最左前缀原则?

当创建(a,b.c)复合索引时,想要索引生效的话,只能使用a和a,b和a,b,c三种组合

2.什么是覆盖索引?

select的数据列仅从索引中就能够取得并且不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。

例子:如以country表a(表示城市).b(表示省)两列做复合索引, select a from country where b='浙江省'

3.Mysql高可用方案有那些?

①双节点主从+ keepalived/heartbeat

②多节点主从+MHA

③基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster(简称PXC)

4.一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录?

①如果A表TID是自增长.,并且是连续的,B表的ID为索引select * from a,b where a.tid = b.id and a.tid>500000limit 200;

②如果A表的TID不是连续的,那么就需要使用覆盖索引.TID要么是主健,要么是辅助索引,B表ID也需要有索引。

select * from b , (select tid from a limit 50000,200) awhere b.id = a .tid;

5.简述mysql主从复制过程?

  • ①主节点binary log dump 线程

当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。

  • ②从节点I/O线程

当从节点上执行start slave命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。1/O线程接收到主节点binlog dump进程发来的更新之后,保存在本地relay-log中。

  • ③从节点SQL线程

SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。

006APoFYly1g5ra1y6277g307u07u4b5.gif