您的位置:首页 > 职场人生

2018年的阿里巴巴第三轮面试,面试题汇总

2018-01-28 15:56 495 查看

面试大概7个问题,虽然结果以失败告终,但是我觉得很不服气(不好意思,就是这么直性子),所以发出来让大家看一看。

注:有的回答可能不正确,或者不完整,别的同学不要拿去直接用。

一上来自我介绍:。。。

问题1:HBase和mysql的区别
HBase基于列存储,查询中的选中规则是通过列来定义,因此整个数据库是自动索引化的。HBase无需考虑分库、分表,它可以对存储的数据自动切分数据,并支持高并发读写操作,使得海量数据存储自动具有更强的扩展性。但是HBase不包含事务,没有表与表之间关联查询,
mysql基于行存储,mysql的innodb引擎带事务控制,表之间的join比较方便;伸缩性比较差。

问题2 :dubbo服务中,1500tps的服务A好2000tps的服务b同时调用服务c,如何实现在两台服务器上独立调用
我回答使用dubbo自带的一致性hash负载均衡。

问题3 :mysql如何自己实现读写分离
我说的是一般两种方式,在应用层实现,或者使用中间件如cobra, amoeda。
mysql自己实现,这个我说没听说过,没答出来。

问题4:cobar,
Amoeba原理
直接回答,原理不知道,接着回答:
Amoeba处于应用程序和数据库服务器之间,充当一个中间代理层。其支持负载均衡、高可用、Query过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。

问题5:如何在应用层实现mysql读写分离
这个就是平时用到的,所以说的比较详细:
总的来说,在进入Service之前,使用AOP来做出判断,是使用写库还是读库,判断依据可以根据方法名判断,比如说以query、find、get等开头的就走读库,其他的走写库。

(1)写一个DynamicDataSource类 继承Spring的AbstractRoutingDataSource,只要实现determineCurrentLookupKey方法即可。
(2)再写一个类DynamicDataSourceHolder,使用ThreadLocal技术来记录当前线程中的数据源的key;
(3)订阅数据源的AOP切面,通过Service的方法名判断是应该走读库还是写库;
(4)Spring的配置文件中配置数据源DataSource为自定义的DynamicDataSource,定义连接池,配置jdbc.properties;
(5)配置事务管理以及动态切换数据源切面。

问题6:redis的list如何在分布式环境上缓存
我回答不知道,但是我知道redis上的sorted set数据结构的使用和原理。
set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,可以选择sorted。比如想要获取自动按照时间排好序的帖子,就可以用帖子发表时间作为score来存储。
实现方式:
  Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的
是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

问题7:分库分表时的一致性hash算法
对节点和数据,都做一个哈希运算,然后比较节点和数据的哈希值,数据取和节点最相近的节点作为存放节点。这样就保证当节点增加或者减少的时候,影响的数据最少。
一种简单的办法,给每个真实结点后面根据虚拟节点加上后缀再取Hash值,比如"192.168.0.0:111"就把它变成"192.168.0.0:111&&VN0"到"192.168.0.0:111&&VN4",VN就是Virtual Node的缩写,还原的时候只需要从头截取字符串到"&&"的位置就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息