前言
业务设计中常常会考虑并发带来的问题及相应的处理方案。根据自己的工作经验做一些整理
0:处理并发问题的目的
- 1:为了保护服务器和系统安全
- 2:保护共享资源安全,不错乱
1:为了保护服务器和系统安全
- 1:优化程序
- 该功能或接口考虑部分业务放到多线程、队列中异步处理
- 涉及io操作考虑在客户端层面完成
- 库表交互考虑缓存架构
- 优化代码,节省内存:不要频繁的new对象、对应场景的集合使用方案、位运算、异步…
- 2:在请求环节处理
- 负载均衡:保护节点避免超负载
- 服务器熔断机制:服务器满负载了就熔断,让其等待或直接返回。
- 限流工具(限流等待,限流返回。RateLimiter、aop锁、分布式锁、分布式计数器等)
- 握手信号
- 超时设定
- 舱壁隔离(Hystrix用到)
- 3:页面资源响应
- 使用生成静态页面,因为静态页面不带有服务器组件
2:保护共享资源安全,不错乱
- 1:让后面的线程排队,保护共享资源
- 锁:排队等待,拿同一个锁。单例或分布式
- 数据库悲观锁、乐观锁:设计关键字段为索引(实现行锁,不加索引会发生表锁。当然也跟引擎的选择有关)for update(乐观锁可使用版本号等字段控制)
- 进程内队列:非阻塞offer()、Disruptor队列
- 2:让后面的线程绕过,不处理(暂时没怎么接触过这样的需求··)
参考: