一、项目中如何进行限流
限流可以分为技术层限流和业务层限流
1、技术层的限流
一种是限制速率(qps),比如rateLimiter,nginx的limit_req模块
一种是限制并发数,也就是根据系统的最大资源量进行限制,比如数据库连接池,线程池,nginx的limit_conn模块
2、业务层限流
比如在秒杀系统中,一个商品库存只有100件商品,现在有两万人抢购,没必要放两万人进来,只需要放前500个人进来,后面的人直接返回已售完即可
二、分库分表
1、为什么要分
- 分表的目的是做业务拆分,通过业务拆分,把一个大的复杂的系统拆成多个业务的子系统
- 考虑是应对高并发,当写入的qps已经达到瓶颈了,需要考虑分库分表
- 另外一个角度是数据隔离,把核心业务数据和非核心业务数据不要放在一个库里
2、拆分维度的选择
比如对于电商的订单表来说,如何拆分呢(订单id、用户id、商户id)
1、建立一个映射表建立
建立辅助维度和主维度的映射关系(商户id和用户id之间的映射关系)
2、业务双写
同一份数据,两套分库分表、一套按用户id,一套按商户id切分
3、异步双写
还是两套表,只是业务单鞋,然后通过监听binlog.同步到另外一套表中
4、两个维度统一到一个维度
3、join查询问题
1、把join拆分成多个单表查询,不让数据库做join,而是在代码层对结果进行拼装
2、做宽表,重写轻读写
为了利用mysql分页功能,不得不用join的情况,可以做一个join表。提前把结果join好。这是重写轻读,也是时间换空间
3、利用搜索引擎