场景题
如何设计一个秒杀系统
- 高性能:高性能核心就是响应时间快,一般来说都会把热点数据放在redis中,但是秒杀高峰的时候有可能连redis都应付不了。有几种解决方案:首先是二级缓存,redis之外用jvm的缓存例如caffeine,一定要控制空间大小,所以必须上淘汰策略例如lru;或者在业务层面进行UV统计,但是需要改写redis的jar;或者直接使用开源解决方案比如京东的hotkey。此外为了提高响应速度还可以将静态资源放到cdn上,例如七牛云阿里云,图片不会再占用服务器的带宽,但是这种属于钞能力的解决方案。
- 高可用:保证节点的故障恢复。需要用集群。包括但不限redis-sentinel,redis-cluster;此外还可以用分布式限流框架sentinel,实现服务限流和降级;优化异步请求可以用mq,mq对于高可用的贡献是流量削峰,将请求打入消息队列,对于高性能的贡献是将减库存缓存和减数据异步化,更快返回请求。
- 一致性:如何防止超卖,可以用lua脚本查询redis中的余量,但是lua的原子性保证的是脚本内都是一条语句,而不是事务上的原子性,出错了是不会回滚的;redis减库存后需要同步到mysql中,可以用mq完成。扣减余额也要考虑并发问题,可以用mysql的排他锁。
- 幂等性:也就是常说的一人一单,可以考虑用分布式锁来锁住当前用户。
大文件断点续传问题
- 前端文件分片,并且通过sha算法生成一个校验和。
- 后端根据这个校验和先去查minio是否有当前分片,如果有就直接跳过
- 如果没有先检验sha校验和,如果匹配说明有效。可以采用并行的方式加快传输
- 所有分片发送完毕后,前端会进行校验,发送整个的sha,与后端合并后的文件进行校验
40亿qq号,如何去重
哈希表和哈希集肯定是不行的,可以考虑用位图。或者数据结构那种外部归并排序
动态线程池
要用到nacos动态配置核心参数