1、高并发
1.1、负载均衡
根据节点负载情况,将客户端请求发送到不同的节点。常用的负载均衡算法如下:
- 轮询
- 加权轮询
- 最少连接数
- 随机
- 源地址哈希(IP Hash)
1.2、缓存
网站性能优化的第一定律:有限考虑使用缓存。
1.3、消息队列
1.3.1、模型
- 点对点模式:一个消息只能被一个消费者消费一次。
- 发布订阅模式:多个订阅者可以从频道订阅这条消息并消费。
1.3.2、使用场景
- 异步处理:例如用户注册发送奖励。
- 流量削锋:服务器根据处理能力从消息队列中获取消息处理。防止短时间内大量请求压垮服务器。
- 应用解藕:一个模块修改不影响其他模块,实现可扩展性。
1.3.3、可靠性
- 发送端可靠性:使用本地消息表,发送成功删除本地消息,失败继续发送。
- 接收端可靠性:消费端业务逻辑幂等性;消息具有唯一编号。并使用一张日志表记录已经消费的消息编号。
1.4、读写分离、分库分表
- 读写分离可以大幅提高读性能,小幅提高写的性能
- 分库分表是为了解决由于库、表数据量过大,而导致数据库性能持续下降的问题。
2、高可用
2.1 降级
- 服务降级是指系统为了应对大量的请求,主动关闭部分功能,以此释放服务器资源从而保证核心功能可用。
2.2 限流
- 限流(Ratelimiting)是指对服务的请求进行限制,例如某一接口的请求限制为 100 个每秒,对超过限制的请求则进行快速失败或丢弃。
- 常见限流算法(分布式服务限流实战,已经为你排好坑了)
- 漏桶算法
- 令牌桶算法
2.3 熔断
分布式id生成算法
- uuid
- 数据库自增id
- snowflake:41bit时间戳 + 10bit机器id + 12bit序列号
分布式系统如何保证一致性
reactor模式
无论是C++还是Java编写的网络框架,大多数都是基于Reactor模型进行设计和开发,Reactor模型基于事件驱动,特别适合处理海量的I/O事件。
Reactor模型中定义的三种角色:
- Reactor:负责监听和分配事件,将I/O事件分派给对应的Handler。新的事件包含连接建立就绪、读就绪、写就绪等。
- Acceptor:处理客户端新连接,并分派请求到处理器链中。
- Handler:将自身与事件绑定,执行非阻塞读/写任务,完成channel的读入,完成处理业务逻辑后,负责将结果写出channel。可用资源池来管理。