每秒钟100万次的商品搜索,响应时间在200ms内。同时应对商品数量超过10亿。你怎么考虑
1.不能使用mysql的like:
商品数量超过10亿不能使用mysq的like,like无法触发索引“%keywords”无法利用索引,触发全表扫描,10亿数量单词查询可能耗时是:数秒。
2.不支持分词搜索:例如:无法拆分“手机”,“壳”单独进行搜索。
3.分库分表后跨库like,查询复杂质数级上升。
总的思路:高可用+可扩展
1,用户层:前端+CDN,通过CDN加速静态资源的
2,浏览器缓存:利用localStorage缓存高频搜索的关键词
3.请求合并:合并相似请求(例如防抖机制)
接入层:NGINX
流量管控:限流,熔断,鉴权。
负载均衡:轮询,一致性哈希分发请求。
协议转换:HTTP2-HTTP1.1
服务层:
业务逻辑:请求参数校验,结果格式化
多级缓存:本地缓存---Redis---es
降级策略:超时返回兜底数据
检索层:
索引构建:商品标题、类目、属性倒排索引
分布式查询:分片并行计算
相关性排序:BM25算法优化
数据层:
mysql分库分表
数据同步
冷热分离:Redis缓存热的数据,Hbase存历史数据。
每个分片控制大小均匀20-50G,避免OOM和延迟。
按照业务分索引和路由分片。
深度分页性能优化:
使用标签记录法来解决深度分页的问题。
1.避免传统:from+size深分页。
2.search After:基于上一页,最后一个sort_value做游标分页,(类似于标签记录法思想)
3.或者限制分页,最多查询多少页。
避免缓存穿透:
什么事缓存穿透:查询一个不存在的数据,由于不存在所以缓存中没有,所以会去数据库查询,数据库也没有查询到所以不会放入到缓存,这个将导致这个不存在数据每次请求都会去数据库中查询,进而给数据库带来压力。
在百万并发商品搜索系统时候,我们要避免这个问题,可以使用布隆过滤器。
浙公网安备 33010602011771号