三年工作经验社招,30分钟全在问项目
一、redis代理
Q:你们问什么要做一层redis代理?
A:因为两个方面,一是成本考虑:如果一个微服务申请一套主从资源花费很大。二是安全问题:加了监控、权限校验、代理缓存热点数据等逻辑在里面。
Q:部署代理不是更浪费资源吗?安全问题redis本身也可以解决啊?
A:跟一个微服务申请一套主从比,用代理更能充分利用redis的内存空间,成本是降低的。安全问题我问他是不是说redis的ssl,我说我们没开,就没问了。
Q:你说的代理端缓存有什么用?一致性怎么保证?为什么不在客户端做缓存?
A:代理内部做热点缓存是能节省代理到集群的一次网络耗时、并且减少redis集群压力的。一致性是有一定的延时问题的,这个跟redis 6.0的客户端缓存是一样的,适用于主要是读的场景,如果业务方能接受一定程度的不一致,是可以开启的。站在业务角度,客户端是要做内存缓存的,两者并不冲突,可以有多级缓存。
Q:还是没理解,如果有热点Key,我可以拆成两个Key,分片到不同的节点上就行了啊?
A:确实可以,但这是站在业务的角度上看的,如果站在中间件的角度上,并没有办法控制业务方怎么做。
Q:Redis Cluster怎么实现的知道吗?可以扩容不就降低压力了?(反正还是没给人说明白
A:我说基于Gossip协议做的集群间通信,集群扩容不方便,还要迁移槽位,而代理是无状态的,可以随时扩容。
Q:我看你写你们代理支持单机8wQPS?耗时多少?
A:单台4C8G的主机,只是简单的get set命令能支持8w QPS。耗时大约在0.2毫秒-0.3毫秒左右。
Q:你0.2毫秒怎么支持的8wQPS,乘起来也不是啊?
A:我说的0.2毫秒是业务方感知的,中间有业务方到代理、代理到集群、集群回包给代理、代理回包给业务4次网络耗时,主要耗时是网络上耗时。
Q:我们这直连redis,一次set只要10ns,你这么高耗时业务能接受吗?
A:你们走网络了吗?网络一次耗时都不止10ns,我们这一次网络都要0.1毫秒左右。
Q:那肯定走网络了啊,那我能是随口编的数据吗?我实际测的我们一次命令10ns,差不多QPS 8w?
A:我知道redis单机大约10w QPS,可能我们这网络有点问题,耗时比较高。。。其实也是没话说了,惊了。。
Q:你们这么慢,还用代理更慢,那不如用mysql了,mysql现在配高性能磁盘,数据量不大的情况跟内存差不多你知不知道?
A:mysql那毕竟是磁盘啊。。我心里其实一万头草泥马飘过。。完全不知道说啥。。。我心里想的是哪像你们大公司那么有钱啊。。
Q:你代理用什么框架实现的?
A:基于netty做的。
Q:代理和业务是长连接吗?怎么维护连接的?
A:是长连接,没特别维护长连接,netty都封装好了。(其实我有感觉,他是想说nacos长连接怎么维护的,可是我没看过nacos源码
Q:那你这个连接数不会爆掉吗?
A:我说不会,因为netty单机支持百万连接数,我们现在生产环境没那么多连接,也就几千级别的,没有这个瓶颈,所以没考虑。
Q:你实际测过netty支持百万连接数吗?号称是支持,实际测过没?
A:没测过,但是目前的量级还没到那个地步。(其实到这里已经知道他想问nacos怎么维护长连接的了,可惜真没看过源码
二、短信系统
Q:你这个是怎么起的?
A:tomcat起的
Q:tomcat里是什么?
A:(我其实没听懂,我心里想就war包啊)没理解。。
Q:你这个总不能是空tomcat吧?
A:我问是不是想问业务流程,他说是,我说blablabla。(我心里想你直接点问就好了呀)
Q:怎么接受HTTP请求的?
A:(没懂想问啥)就走的Servlet啊。。
Q:我当然知道Servlet啊,tomcat只能用Servlet
A:(我心里想你知道还问,都不知道想问啥)沉默。。。(其实后来想应该是问tomcat接受HTTP请求流程,走的Coyote监听端口、转发给catalina、pipeline那套,当时忘记了。他也不问详细点,我直接晕了)
Q:你这里面多家三方供应商负载均衡怎么做的?
A:比如两家供应商,一家30%比例,一家70%,就开10个长度数组,哈希取模10,前三个取第一家否则取第二家。
Q:你写的这里面分库分表怎么做的?了不了解sharding-sphere有几种模式?blablabla jdbc啥的。
A:(我心里想的是哈希分表、日期分表啥的)嘴上说的是没用这些,是自研的分库分表组件,在客户端做的,他也就没问了。
三、导入导出系统
Q:业务流程
A:blablabla
Q:看你这里面说用了CountdownLatch,干嘛用的?
A:blabla大概意思是阻塞主线程,等子线程都走完再走。
Q:你这个导入到一半异常了怎么办?
A:事务这里不太好做,需要业务自己控制。导入到一半异常会停止任务。导出的话如果一半异常了,会把异常写进导出的excel里。
总结:redis方面,感觉没讲到一个点上去,面试官是从业务角度,他们现状是一个服务用一套,觉得好得很,没必要用代理,我是站在中间件角度看的。其他还有很多受限于时间,没有完全讲完,像tomcat原理这种其实会的,也没想到回答。