如何提高项目的并发量
减少交互,提高接口并发
前端
- 移动端还是web段,静态资源,使用cdn
- 图片短视频都放在第三方存储上
- 精灵图,将一些小图标做成一个图,在前端通过定位
- 适用前端存储,放在
vue
的localstory
,存放一些不敏感的信息 - 前端缓存:响应头中的
cache-control
中的max-age
设置过期时间,在过期时间内就不会向服务器发送请求
后端
- 使用nginx转发(不是直接使用uwsgi接受http,而是通过nginx转发socket来接收,这样走的更底层就会更快,uwsgi协议)
- 使用性能高的wsgi服务器部署项目(uwsgi,gunicorn)
- 起多个
uswgi+django
服务,监听多个端口 - nginx做负载均衡
- 多态机器上起多个
uswgi+django
,nginx做负载均衡(nginx单个并发10w) - 动静分离,uwsgi只负责处理动态请求,静态请求直接用nginx去取
- 静态资源(头像,图片),cdn,放在第三方云平台,oss,七牛云,公司自己搭建存储服务器(fastdfs,ceph)
- 页面静态化(首页,秒杀场景秒杀页面),数据同步问题(只要数据库变更(管理员更新了轮播图)了静态化的页面需要重新生成(celery使用场景))
- 单台nginx顶不住,nginx做集群,高可用keepalive,F5的硬件负载均衡器 ,dns的负载均衡
代码层面
- 使用异步,使用多线程,或者用协程
- 更复杂的耗时更长的使用celery,或者使用消息队列(rabbitmq),把任务做成异步
- 数据库查询语句优化,sql索引的创建,尽量不要再for循环中执行,长慢sql
- 使用缓存接口缓存,redis,redis再顶不住,搭主从,哨兵,再不行集群,弄多台机器
- 个别接口全用缓存(qps高的接口)
- 使用全文检索es,再给es搭集群
- 代码逻辑层间,写一写执行较快的逻辑,猴子补丁
- 换语言,写成一个个服务,一点点替换