面试
Session和Token的区别
-
Session是直接将用户信息存放在服务端的,会占用服务端的内存
Token是将用户数据加密成字符串存放在前端的,不需要占用服务端内存
-
Session的访问速度较快,因为请求每次进来不需要进行过多处理即可验明身份
Token的访问速度较慢,每次请求进来需要对Token进行解析
-
Session实现分布式相对麻烦,因为session一般是直接存放在物理机的内存中的,多个服务之间没有办法直接共享
Token是以字符串形式存放的,多服务之间只要配置的密钥相同可以直接共享
-
Session相对不安全,session的sessionid是通过设置cookie实现的,而cookie在跨站访问时是可以被获取的。无法防止CSRF
Token一般是将字符串设置在请求头中传过来的,非法网址没有办法获取
为什么Cookie无法防止CSRF而Token可以
cookie中存放着sessionId,而使用session的网站是通过这个sessionId来识别用户的
浏览器在请求这些网站的时候会带上sessionid,即使是不同的网站也会携带,所以非法网站就可以获取用户的cookie来伪造请求
而Token是发送请求时客户端手动设置到请求头上的,所以跨站之间是没有办法获取这个token的
XSS是什么,如何解决
状态码502和504
CPU、Load飙高排查思路
SMTP服务器邮件发送失败
- 邮件地址错误
- 服务器IP被屏蔽
高并发系统设计
实现高并发的主要是分布式、缓存、多线程等方式
对于架构设计来说主要考虑三个层面
基础设施层:多机房、监控
服务端架构层:系统架构、集群架构、数据库设计、缓存设计、消息队列、服务治理、
系统架构:分层、分割、分布式
架构分层
将系统横向维度分层,每层的职责尽可能单一,通过上下层的调度和依赖组成完整系统
业务分割
纵向维度对业务进行分层,将一块相对复杂的业务分割成一个独立的模块,通过合理的模块划分使每个模块尽可能保住高内聚低耦合的设计要求,提高并发能力
分布式
对业务模块进行独立部署和负载均衡
集群架构
集群负载均衡保住可用性
数据库设计:读写分离、分库分表、冷热分离
读写分离:数据库主从分离后在主库上进行写,从库上进行读提高并发
分库分表:通过分库分表对数据进行存储
(存在问题:增加系统复杂性,分库分表只支持几个维度的读写,对业务来说也是一种限制)
冷热分离:针对业务场景而言,如果数据存在冷热之分可以考虑将冷热数据分开存储
缓存设计:远程缓存、本地缓存
缓存的最大作用就是提升系统性能
- 远程缓存:例如使用redis
- 本地缓存:本应用缓存、其他应用缓存
- 本应用缓存:对java来说就是堆空间
- 其他应用缓存:指的就是机器缓存中除了本服务之外的缓存,比如在本服务器中部署一组redis,应用直接读取本机缓存,这种方式的优点事没有网络消耗
缓存一致性问题:MQ广播通知机器删除缓存、canel监听(订阅日志)
服务应用层
多线程、协程
异步化
预处理:预加载、预热
比如jvm、缓存预热
数据预加载,比如提前加载1-2页的数据,