架构
黄鸭 3/23/2022 server
# 1.项目中熔断和限流怎么做的?
查看答案
- 熔断:在发生故障的时候,熔断保证错误减少
- 降级:为了保证核心功能,降低或关闭部分功能保证核心功能
- 限流:控制单位时间内的请求数量
# 2.一致性哈希和普通哈希区别?
查看答案
当hash命中的机器宕机时,一致性hash能引导数据到下一个可用的机器上执行
# 2.非对称加密慢怎么解决?
查看答案
使用非对称加密传输秘钥,实施对称加密
# 2.有100G的文本文件,我要解析出这些文本中包含的URL并统计出来,取出其中的Top10,要求用并发编程加速。
查看答案
hash分文件,每个文件聚合,大根堆筛选前10个 海量数据问题套路
- 1.hash映射,hash统计,堆/快速/归并排序
- 2.多层划分
- 3.bloomfilter/bitmap
- 4.trie树/数据库/倒排索引
- 5.外排序
- 6.mapreduce
# 网页爬虫原理
查看答案
bfs,布隆过滤器
# 会RPC是吧?让你设计一个RPC框架,你主要会关注哪几个点,简单介绍下?
查看答案
- RPC是像使用本地函数一样使用远程接口
- 一个简单的rpc需要满足一下几点
- 1.功能,需要支持同步异步等调用过程
- 2.连接,选择http还是tcp/ip
- 3.协议,选择json xml来满足跨语言需求
- 4.调度,选择主节点满足注册,监控的功能
- 5.push和pull 短轮训,长轮训 慢消费,客户端是否繁忙,保证是否有序
# RPC是基于TCP和UDP?数据传输过程中的简单流程又是怎样的?
查看答案
- 发送时先将数据序列化,然后封包发出
- 接收时先解包然后数据反序列化
# 客户端请求一个不存在的端口,会发生什么?
查看答案
- udp: 如果目标端口未开放返回rst(端口未打开),如果开放则不会返回任何内容(没有内容)
- tcp:如果目标端口开放返回syn/ack(请求超时),如果未开放返回rst/ack(端口未打开)
# 设计消息队列应该考虑些什么问题,消息持久化的文件存储格式应该怎么设计
查看答案
- 消息队列的功能:解耦,最终一致性,广播,错峰控流
- 消息队列本质是rpc+存储
- 除了rpc设计思路外还需要考虑存储持久化和非持久化
# RPC和HTTP的区别
查看答案
- 他们都是应用协议
- RPC属于私有协议,可以自定义协议
- HTTP属于公有协议,主要服务于浏览器
# TCP和UDP的区别,TCP保证可靠的机制
查看答案
- 三次握手四次挥手
- 检验和,判断是否错误
- 序列号,可靠,按序,去重,多次发送一次确认
- 确认应答,应答下一个标识
- 超时重传,无应答时重传
- 流量控制
- 拥塞控制
# 讲一下流量控制的过程
查看答案
- a告诉b自己的缓存大小为rwnd,b向a传递的窗口就为rwnd
- 流量控制和拥塞控制取小值
# redis和mysql数据一致性问题(缓存和持久化一致性问题怎么解决的)
查看答案
- 更新缓存,更新数据库
- 更新数据库,更新缓存
- 删除缓存,更新数据库
- 更新数据库,更新缓存
- 读数据库,写缓存
- 改变顺序会发生问题
- 所以采用延时双删策略
# Protobuf和Json之间的区别
查看答案
- gRPC的沟通内容是protobuf,二进制
- protobuf跨语言,兼容好
- protobuf速度快,体积小
- json是文本类型的
- json可视化
- json js可以直接使用
# TCP 的各种标志位
查看答案
- SYN是开启连接
- seq序号用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记
- ACK是指回复包,
- ack是只有ACK标志为1时,确认序号字段才有效,ack = seq + 1
- FIN是结束连接(单向断开,优雅断开),
- RST是重置连接(双向都直接不能处理了),
- PSH是数据推送,
# FIN-WAIT-2是什么时候的?(四次挥手状态)
查看答案
- 客户端四次挥手的时候,
- 一开始客户端的状态是established,他给服务端发断开连接的时候客户端的状态变成FIN-WAIT-1
- 服务端起始状态是established,接收到消息后状态会变成CLOSE-WAIT
- 客户端收到服务端的第一个消息后变成FIN-WAIT-2
- 服务端要准备好所有东西发送第二个连接之后服务端状态变成LAST-ACK
- 客户端收到服务端的第二个消息后变成了TIME-WAIT(这种状态会持续2MSL)
- 客户端在2MSL之后会自动变为CLOSED,服务端在收到客户端给的反馈后变成CLOSED
# 三次握手状态
查看答案
- 一开始客户端状态位CLOSED
- 服务端是CLOSED转LISTEN
- 客户端给服务端发消息时自己状态变成SYN-SEND
- 服务端收到消息并给客户端发消息之后状态变成SYN-REVD
- 客户端收到消息之后状态变成established并给服务端发消息
- 服务端收到消息后状态变为established
# timewait,closewait状态
查看答案
- 服务端起始状态是established,接收到消息后状态会变成CLOSE-WAIT
- 客户端收到服务端的第二个消息后变成了TIME-WAIT(这种状态会持续2MSL)
# 四次挥手时不需要close wait,等待服务端要发送数据时,一次性把ack和fin发过去可以吗?
查看答案
- 服务器接收数据后会立即返回ack
- 等数据准备完成之后才会发送fin.
# 四次挥手中,服务端请求断开连接的时候,客户端回复ACK确认后,就立即关闭连接,然后2MSL等待放在服务端为什么不可以?
查看答案
- 2MSL功能
- 客户端在等待服务器的再次确认,服务器没有必要等待
- 第一用于保证客户端发送的最后一个ACK报文可以到达服务器,如果这个ACK报文丢失,服务器会觉得客户端没有收到我发的请求断开报文,于是服务器就会重发一次,如果客户端在这个2MSL时间段内收到重传的报文,就会重新给出回应报文,还会重启2MSL计时器。
- 第二是在这个2WSL时间中,可以使本链接持续时间内产生的所有报文段从网络中消失,这样新的TCP三次握手的时候就不会出现旧链接中失效的请求报文。
# tcpip三次握手建立过程标志位
查看答案
- 客户端->SYN=1 seq=x
- 服务端->SYN=1 ACK=1 ack=x+1 seq=y
- 客户端->ACK=1 ack=y+1 seq=x+1
# tcpip四次挥手过程表示位
查看答案
- 客户端->FIN=1 seq=u
- 服务端->ACK=1 seq=v ack=u+1
- 服务端->ACK=1 FIN=1 seq=w ack=v+1
- 客户端->ACK=1 seq=u+1 ack=w+1
# MSL是什么
查看答案
- tcp_fin_timeout默认值为60 msl值为30s
- 报文最大生存时间,tcp允许不同的实现可以设置不同的MSL值
# 计算机网络应用层协议有哪些。
查看答案
http ftp dns websocket