记一次安心记加班面试记录
简历处理很快,放假投递的,第一个工作日就收到面试邀请了,一面面试官很年轻,也很有技术范,聊的很开心,有些问题没有想出来,面试官引导的非常好,思维很活跃,很希望能一起共事,二面面试官问的问题都比较笼统,不是很具体,回答的时候我自己也没有问清楚具体应用场景,没有答到点上,经验也比较少,所有毫无悬念的挂了,但两位面试官脾气都很好,面试过程中收获很多,十分感谢,有一些没有回答出来,或者回答不够好的问题,予以记录:
- 我使用的Token是如何保障信息安全的,使用的对称加密还是非对称加密,如果我离职了,知道Token的生成算法,能不能随意构造用户Token,为什么使用Token而不使用Session?
- 有没有用过MQ,知不知道RPC,还用过哪些消息队列,知不知道Redis的垃圾回收机制,那PHP的呢,如果是常驻进程呢?
- Nginx和PHP之间是怎么工作的,Nginx的负载均衡有哪些常用算法和用法,Nginx的负载均衡是几层代理?
- 数据库的事务隔离级别有哪些,有用到过哪些?怎么解决并发读脏数据的问题?
- 使用git进行版本控制时,团队有哪些使用规范?如果自己的提交被冲掉了,如果恢复,是合并后发布还是发布后合并,如果发布了,有bug如果解决,分支该如何管理?
- Symfony框架和ThinkPHP框架有哪些区别和共同点,模板引擎有哪些,模板引擎是如何工作的,谈谈Symfony的依赖注入?
1. 我使用的Token是如何保障信息安全的,使用的对称加密还是非对称加密,如果我离职了,知道Token的生成算法,能不能随意构造用户Token,为什么使用Token而不使用Session?
2. 有没有用过MQ,知不知道RPC,还用过哪些消息队列,知不知道Redis的垃圾回收机制,那PHP的呢,如果是常驻进程呢?
MQ - 消息队列(Message Queue),队列结构的中间件,消息放入后,不需要立即处理,由订阅者/消费者按顺序处理,一般的应用场景:流量削峰、排序保证、解耦、异步通信、扩展性。
RPC - 远程过程调用(Remote Procedure Call),通过网络从远程计算机上请求服务。
两者的异同:
RPC系统结构:
+----------+ +----------+
| Consumer | <=> | Provider |
+----------+ +----------+
Consumer调用的Provider提供的服务。
Message Queue系统结构:
+--------+ +-------+ +----------+
| Sender | <=> | Queue | <=> | Receiver |
+--------+ +-------+ +----------+
Sender发送消息给Queue;Receiver从Queue拿到消息来处理。
RPC | MQ |
---|---|
请求响应模式 | 生产者消费者模式 |
同步(也可以异步) | 异步 |
面向动作 | 面向数据 |
无存储 | 有存储 |
解耦 | 解耦 |
常见的消息队列: MQ、Redis 、MySQL
消息队列触发机制:死循环、定时任务、守护进程(类似于PHP-FPM)
Redis内存回收
引用计数算法
在创建一个新对象时, 引用计数的值会被初始化为 1 ;
当对象被一个新程序使用时, 它的引用计数值会被增一;
当对象不再被一个程序使用时, 它的引用计数值会被减一;
当对象的引用计数值变为 0 时, 对象所占用的内存会被释放。
LRU算法
数据结构: HashMap + Double LinkedList,时间复杂度O(1)
当内存达到MAX_MEMORY上限时会触发响应的溢出控制策略,Redis支持以下6种策略
noeviction:默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息,此时Redis只响应读操作。
volatitle-rlu:根据LRU算法删除设置了超时属性的键,知道腾出足够空间为止。如果没有可删除的键对象,回退到noeviction策略。
allkeys-lru:根据LRU算法删除键,不管数据有没有设置超时属性,直到腾出足够空间为止。
allkeys-random:随机删除所有键,知道腾出足够空间为止。
volatitle-random:随机删除过期键,知道腾出足够空间为止。
volatitle-ttl:根据键值对象的ttl属性,删除最近将要过期数据。如果没有,回退到noeviction策略
PHP内存回收
也是引用计数算法
3. Nginx和PHP之间是怎么工作的,Nginx的负载均衡有哪些常用算法和用法,Nginx的负载均衡是几层代理?
Nginx和PHP之间是怎么工作的:
CGI(Common Gateway Interface)协议 和 FastCGI协议,是Web Server与后台语言交互的协议,通过这个协议,开发者可以使用任何语言处理Web Server发来的请求。
FPM(FastCGI Process Manager),它是FastCGI的实现,是一个进程管理器,包含master进程和worker两种进程。master进程只有一个,负责监听端口,接受来自Web Server的请求,而worker进程一般有多个,每个进程内部都嵌入了一个PHP解释器,是PHP代码真正执行的地方。
Nginx负责监听网站的80端口,然后将所有以.php结尾的请求都交给FastCGI模块处理,从而把所有PHP的请求都交给fpm处理,再把处理结果通过nginx返回给客户端。
Nginx负载均衡常用算法:
- 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,则自动剔除故障机器,使用户访问不受影响。
- weight:指定轮询权重,weight值越大,分配到的几率就越高,主要用于后端每台服务器性能不均衡的情况。
- ip_hash:每个请求按访问IP的哈希结果分配,这样每个访客固定访问一个后端服务器,可以有效的解决动态网页存在的session共享问题。
- fair(第三方):更智能的一个负载均衡算法,此算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。如果想要使用此调度算法,需要Nginx的upstream_fair模块。
- url_hash(第三方):按访问URL的哈希结果来分配请求,使每个URL定向到同一台后端服务器,可以进一步提高后端缓存服务器的效率。如果想要使用此调度算法,需要Nginx的hash软件包。
Nginx的负载均衡是几层代理:
负载均衡器通常称为四层交换机或七层交换机。四层交换机主要分析IP层及TCP/UDP层,实现四层流量负载均衡。七层交换机除了支持四层负载均衡以外,还有分析应用层的信息,如HTTP协议URI或Cookie信息。
Nginx工作在七层代理,可以针对HTTP应用本身来做分流策略,比如针对域名、目录结构等。