百度golang研发一面面经
输入一个网址,到显示界面,中间的过程是怎样的
IP 报文段的结构是什么
Innodb 的底层结构
知道几种设计模式
- 工厂模式
- 简单工厂模式:根据传入类型参数判断创建哪种类型对象
- 工厂方法模式:由子类决定实例化哪个类
- 抽象工厂模式:创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类
- 单列模式:确保一个类只有一个实例,并提供一个全局访问点来访问该实例。
- 建造者模式:在软件系统中,一个复杂对象的创建通常由多个部分组成,这些部分的组合经常变化,但组合的算法相对稳定。
- 观察者模式:创建了对象间的一种一对多的依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。
单例模式的应用场景
单例模式的核心在于确保一个类只有一个实例,并提供全局访问点。它适用于那些需要严格控制资源访问、保证状态一致或避免重复创建开销的场景。以下是其典型使用场景:
-
访问共享资源或硬件:
- 数据库连接池: 创建多个数据库连接开销巨大。单例的数据库连接池管理所有连接,确保高效复用,避免资源耗尽。
- 日志记录器: 应用所有部分都需要写入同一个日志文件。单例日志器保证所有日志消息被顺序、一致地写入同一个目标文件,避免并发写入冲突。
- 打印机后台处理程序: 多个打印任务需要有序排队处理同一个物理打印机。单例的后台处理程序管理队列,确保一次只有一个任务访问打印机。
- 文件系统/硬件驱动: 访问物理资源(如特定硬件设备、配置文件)通常需要唯一访问点,单例确保请求被有序处理且状态一致。
-
全局配置管理器:
- 应用配置(如数据库URL、API密钥、应用设置)通常只需加载一次并在全局共享。单例配置管理器在启动时加载配置,并提供全局访问点,确保所有组件使用同一份、最新的配置信息,避免重复读取文件或解析的开销。
-
缓存:
- 应用级缓存(如内存缓存)需要被所有组件访问和更新。单例缓存实例确保所有组件共享同一份缓存数据,提高访问速度,并可通过单例集中管理缓存的失效、刷新策略。
-
上下文对象:
- 运行时上下文信息(如Web应用中的当前用户会话、应用上下文、线程池)通常在整个应用生命周期或特定作用域内需要唯一且全局可访问。单例(或结合ThreadLocal实现的线程单例)能有效管理这类状态。
关键特征总结(判断是否适用单例):
- 全局唯一性: 系统中确实必须只有一个该类的实例存在。
- 全局访问: 该实例需要被系统中的许多不同部分方便地访问。
- 控制共享资源: 需要管理对共享资源(数据库、文件、硬件)的并发访问。
- 集中管理状态: 需要维护一份全局共享、一致的状态或配置信息。
- 昂贵初始化: 对象创建和销毁开销非常大,需要严格控制创建次数。
重要注意事项(避免滥用):
- 测试困难: 单例的全局状态使得单元测试复杂化(测试之间状态污染)。可通过依赖注入(注入单例接口的模拟实现)或提供重置机制来缓解。
- 隐藏依赖: 单例通过全局访问点引入依赖,破坏了代码的显式依赖关系,降低了可读性和可维护性。
- 违反单一职责原则: 单例类除了自身业务逻辑,还承担了控制实例化的责任。
- 潜在并发问题: 多线程环境下需要小心实现(双重检查锁定、静态内部类、枚举等),确保线程安全。
- 过度全局化: 不是所有“只需要一个”的对象都适合单例。如果对象作用域有限(如请求作用域),考虑其他模式(如依赖注入容器管理作用域)。
观察者模式
拍卖系统:拍卖师作为主题,竞价者作为观察者,拍卖价格更新时通知所有竞价者。
观察者模式(Observer Pattern)是一种行为设计模式,用于定义对象之间的一对多依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。以下是对观察者模式的详细介绍:
1. 结构
观察者模式主要包含以下几个角色:
- 主题(Subject): 被观察的对象,维护观察者的列表,并提供添加、删除观察者的方法。
- 观察者(Observer): 依赖于主题的对象,定义一个更新接口,以便在主题状态改变时进行通知。
- 具体主题(Concrete Subject): 实现主题接口,维护状态并在状态变化时通知所有观察者。
- 具体观察者(Concrete Observer): 实现观察者接口,接收主题的通知并作出相应的处理。
2. 工作原理
- 注册观察者: 观察者通过主题的注册方法订阅主题。
- 状态变化: 当主题的状态发生变化时,主题会调用所有注册观察者的更新方法。
- 通知观察者: 观察者在收到通知后,可以获取主题的新状态并作出相应的反应。
3. 使用场景
- 事件驱动系统: 例如 GUI 组件中的事件监听。
- 数据模型: 在 MVC(模型-视图-控制器)架构中,模型状态变化时通知视图更新。
- 消息推送: 实现消息订阅和推送机制,如社交媒体应用中的通知。
- 实时数据监控: 例如股票价格变化时通知投资者。
4. 优缺点
优点
- 解耦: 观察者与主题之间松散耦合,易于扩展和维护。
- 动态性: 可以在运行时动态添加或移除观察者。
缺点
- 性能问题: 如果观察者数量众多,通知所有观察者可能会造成性能开销。
- 循环依赖: 如果观察者与主题之间存在循环依赖,可能导致不必要的复杂性。
总结
观察者模式是一种强大且灵活的设计模式,适用于需要实现对象间动态交互的场景。通过定义清晰的接口和方法,观察者模式能够有效地管理对象之间的关系,提高代码的可维护性和可扩展性。
既然 IP 层会分片,为什么 TCP 层还需要 MSS 呢?
如何优化 TIME_WAIT?
- 复用处于 TIME_WAIT 的 socket 为新的连接所用
- 当系统中处于 TIME_WAIT 的连接一旦超过net.ipv4.tcp_max_tw_buckets(默认18000)值时, 系统就会将后面的 TIME_WAIT 连接状态重置
- 程序中使用 SO_LINGER跳过time_wait 直接调用close 发送RST
服务器出现大量 TIME_WAIT 状态的原因有哪些?
- http没有使用长连接
- http长连接超时
- 长连接数量请求达到上限
服务器出现大量 CLOSE_WAIT 状态的原因有哪些?
如果已经建立了连接,但是客户端突然出现故障了怎么办?
保活机制,探测报文