使用场景
前提(一):视野
某些技术可以没在项目中用过,但是要有自己的理解和视野,当你都说出来的时候,面试官也不会在意你到底在工作中用没用过了。
如: 数据库设计
a. qps很低 — 单机mysql就可以支撑
b. 读和写差距很大 — 读写分离,更稳定,数据不一致问题解决方案
c. qps很高,mysql撑不住 — Redis
d. Redis分片 — qps更高,单机redis撑不住
e. 涉及复杂条件,搜索 — ES
f. 更灵活更复杂的数据 — mongo
…
前提(二):如何学习一个技术(个人观点,不喜勿喷)
a. 学会给自己提问,链式深挖。 a问题->b问题->c问题
b. 这个技术诞生是为啥?是干啥的解决了什么问题什么痛点?
c. 主要思想,原理,有什么骚操作~
c. 凡事必是有利有弊,会出现什么问题->解决方案
d. 对比学习: 一个技术可能有很多种产品,既然还没被淘汰肯定有各自的优缺点,就可以知道哪个场景用哪个
c. 以上全部是原理,思想,没有实操,接下来就是落地:动手搭代码,学习基本语法,跑通
1. 项目
1.1 微服务是怎么拆分的,都有哪些模块?
1.2 需求生命周期
2. 中间件业务场景举例?
2.1 redis
3.2 MQ
1. 你知不知道你们系统里为什么要用消息队列这个东西?
解耦:
一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。
但是其实这个调用是不需要直接同步调用接口的,如果用 MQ 给它异步化解耦,也是可以的,你就需要去考虑在你的项目里,是不是可以运用这个 MQ 去进行系统的解耦。在简历中体现出来这块东西,用 MQ 作解耦。
异步:
削峰:消息积压解决方案。
2. 既然用了消息队列这个东西,你知不知道用了有什么好处&坏处?
优点上面已经说过了。
缺点有以下几个:(面试可以提前准备的)
-
系统可用性降低
MQ挂了咋办 ?如何保证消息队列的高可用?
-
系统复杂度提高
消息重复消费,消息丢失,消息传递顺序性…
-
一致性问题
A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?数据不一致了。
3. 既然你用了 MQ,可能是某一种 MQ,那么你当时做没做过调研?
(场景题准备工作)
4. 基本原理了解
- RabbitMq :不适合分布式,适合高吞吐量(集群), 拉取 & 推送, 单机,普通集群,镜像集群
- Kafka:多分区,多副本的天然分布式消息系统,Broker–Topic–Partition, 拉取
5. 你在工作中那些场景用到过举个栗子?
RabbitMq
Kafka:
6. 设计一个消息队列?需要考虑什么?
建议都说Kafka吧!一般说这个是没什么毛病 !
Kafka 特点:
1. 可靠性:具有副本及容错机制。
2. 可扩展性:kafka 无需停机即可扩展节点及节点上线。
3. 持久性:数据存储到磁盘上,持久性保存。
4. 性能:kafka 具有高吞吐量。达到 TB 级的数据,也有非常稳定的性能。
5. 速度快:顺序写入和零拷贝技术使得 kafka 延迟控制在毫秒级。
-
可扩展性:参照一下 kafka 的设计理念,broker -> topic -> partition,每个 partition 放一个机器,就存一部分数据。如果现在资源不够了,简单啊,给 topic 增加 partition,然后做数据迁移,增加机器, 不就可以存放更多数据,提供更高的吞吐量了?
-
磁盘落地|持久化:那肯定要了,落磁盘才能保证别进程挂了数据就丢了。那落磁盘的时候怎么落啊?顺序写,这样就 没有磁盘随机读写的寻址开销,磁盘顺序读写的性能是很高的,这就是 kafka 的思路
-
可用性: kafka 的高可用保障机制。多副本 -> leader & follower -> broker 挂了重新选举 leader 即可对外服务。
-
细节:可靠性传输:0丢失方案,重复消费方案,顺序性方案,延时以及过期失效问题方案…
如果问的实在太深:就说不好意思太深入的没研究过。
3.3 Nginx
1. 是什么, 有什么优势,解决了什么问题
- 是个C语言写的软件,反向代理web服务器;
- 速度更快、并发更高;配置简单,扩展性强;高可靠性;热部署;
2.能做什么
- 反向代理
- 负载均衡
- 防盗链
- 解决跨域问题、
- 缓存
- 限流
- 动静资源分离;
3. 基本原理了解
-
原理图来一波~
进程模型
-
安装:自学建议docker pull nginx,yum install 都可以
-
安装后的目录:
- 常用启停命令:
/usr/local/nginx/sbin/nginx #默认启动方式 startnpm
/usr/local/nginx/sbin/nginx -t #测试配置信息
/usr/local/nginx/sbin/nginx -v #显示版本信息,-V(大V)显示编译时的参数
/usr/local/nginx/sbin/nginx -s stop #快速停止服务
/usr/local/nginx/sbin/nginx -s quit #正常停止服务
/usr/local/nginx/sbin/nginx -s reload #重启
#要是停不掉可以全部干掉,强制停止,不够优雅~ 不是热部署,不建议这么玩
killall nginx
- nginx.conf
4. 工作中应用场景
-
单节点:反向代理:在开发部署一套自己的前后端,用于自测或联调;
-
场景描述
现有环境: 开发环境服务器192.168.1.10,上面部署了一套单节点的前后端。
-
你开发完成了接口,需要前后端联调,此时你需要部署一个你自己的节点给前端调你最新的接口;
-- 方案1:可以本地起一个服务注册到10上,但是要是下班了人家前端要干活就调不通了; -- 方案2:可以打包放到10上面去启动节点,就解决了1的问题,确定是要改后端代码就得换包; 此时都不需要修改nginx的东西,前端本地修改服务为basic-service-tfy就可以调到你服务上面的新代码;
-
前端也开发完成了,需要部署一套自己的前端,给开发负责人看下流程,或者前后端自测;
-- 方案1:跟上面一样,也在本地启动一个,但是要是还有别的工作任务,就很麻烦,肯定还是部署到服务器上最好; -- 方案2: 前端打包放到服务器上面, 修改nginx.conf, 复制一套server,改前端改为dist-xxx:新端口
如图:
-
-
-
HA高可用:反向代理+负载均衡 +(keepalived)
常规:一开始你只有一台 web 服务器对用户提供服务,用户可以直接连接你的web服务器去实现各项需求,此时其实不需要nginx.
负载均衡:随着业务不断扩大,发现单机模式下网站支撑不了那么大的流量,于是使用分布式架构,并使用nginx实现负载均衡功能.
nginx 做成分布式+ keepalived:如果 nginx master 出现宕机,keepalived则会将服务切到 nginx slave上,保证业务不受影响
这样就可以避免 nginx 单机故障问题,以此来实现高可用.
# 在http模块的keepalive_timeout 100; 行下添加如下内容
upstream xxx{
ip_hash; #分配规则
server 本地IP:8930;
server HA的IP:8930;
...
}
#在location/gateway模块下修改对应行的配置
proxy_pass http://xxx;
简单介绍一下keepalived,细节可以自己去学习:可参考https://blog.csdn.net/bushqiang/article/details/108168605
安装: yum install -y keepalived
例: 129和130的keepalived配置虚拟ip : virtural_ipaddress { 192.168.233.100}
keepalived.conf 示例
3.4 ES
4. 基础部分
4.1 JUC使用场景
4.2 多线程使用场景
4.3 JVM调优案例
4.4 设计模式使用场景
5. 数据库
5.1 Mysql
- 集群场景
- 分库
- 分表
- 调优
5.2 Redis
- 哨兵
- 部署