面试问题
文章:
项目亮点总览
项目描述:本抽奖系统是智动社区的扩展服务,本项目以使用和调用美团、京东、字节掘金的抽奖场景服务,负责提供各种抽奖活动,定期对平台活跃度高、贡献度大的用户奖励抽奖资格,从而提高整个平台用户的活跃度和积极性。同时将该系统与微信公众号进行对接,为用户提供方便快捷的抽奖体验。
后端技术:Spring Boot、Sharding-JDBC、Mybatis、Dubbo、MySQL、XXL-Job、Kafka、Zookeeper。
核心工作:
- DDD架构设计:分解出活动、奖品、抽奖策略领域,抽象出抽奖流程,分为抽奖前中后,并对各节点拓展各种行为动作。如抽奖前的人群判断,抽奖中库存扣减,抽奖后兜底奖励等。
- 分库分表:考虑到抽奖系统的高并发吞吐量,采用分库分表组件,并使用该组件进行以用户ID为切分的路由操作。
- 缓存优化:使用布隆过滤器来过滤大量非法的数据请求,使用逻辑过期来预防热点Key访问导致的缓存击穿。
- 流量承接:针对抽奖活动的并发场景,借鉴 ConcurrentHashMap 分段锁的思想,从独占竞态锁结合库存编号优化为分段竞态锁,细化了锁的粒度,将抢锁失败率从90.66%降低到1.33%,显著提升了系统的性能和用户体验。
- 业务一致性校验:对账户额度订单等的关键操作配置幂等校验。在抽奖完成后将任务写入 task 表,并设置定时任务扫描 task 表发送 MQ 消息通知奖品发货,用户中奖流水和负责发送MQ的task任务由定时任务扫捕更改状态,保证业务最终一致性。
- 人群细分引擎:依据系统内年龄、性别、等级、贡献度等规则策略过滤,搭建了去中心化的量化人群规则引擎组件([[2024-03-11-Lottery抽奖系统]]——见【规则引擎——决策树】模块),完成自由组合的人群过滤服务,控制运营成本及精细化运营。
业务一致性校验
redis高可用
- redis服务崩了数据直接打到服务器怎么办
- 简答:【核心】缓存、扩容、加机器
- 合理条件下重启mysql服务器
- 恢复时做好服务降级、熔断处理
- 降级后的数据恢复处理
- 程序员主要还是在技术层面关注预防
- redis高可用
- 主从、哨兵、集群
- 主从、集群:运维处理
- 配置过程:应对redis集群崩溃方法
- 使用
- 哨兵选举主节点过程
- 主从、哨兵、集群
- redis缓存失效预防
- 击穿、穿透、雪崩
- 布隆过滤器
布隆过滤器
- 简答:【核心】缓存、扩容、加机器
为什么使用布隆过滤器
【缓存优化:使用布隆过滤器来过滤大量非法的数据请求】 我们使用布隆过滤器来记录存储所有可执行抽奖的策略、抽奖活动、用户抽奖结果表数据的key值,这些数据数据体量不大并且更新频率不高,使用布隆过滤器进行一次全量数据的记录后,不需要对过滤器进行多次扩容操作,并且有效预防了缓存穿透的情况,使用较低的成本就能保障数据库的稳定性和安全性。
布隆过滤器原理
弊端
考虑更换布谷鸟过滤器 布谷鸟过滤器原理
布隆过滤器使用
- 单机版guava包下引入布隆过滤器
- 使用redis bitmap实现分布式布隆过滤器 使用demo
bitmap和布隆过滤器
布隆过滤器和 bitmap 一样底层也是通过 bit 位来表示数据是否存在。但是二者使用场景不一致。
参考文章:Bitmap 和 布隆过滤器傻傻分不清?
逻辑过期
活动id,逻辑过期
分段竞态锁
通用面试题
为什么mq用文件系统存储消息,不选择数据库等方式进行持久化,不同的方式有什么优缺点?
业界几款主流的MQ消息队列采用的存储方式主要有以下三种方式:
- 分布式KV存储:比如 Redis
- 文件系统:比如RocketMQ、Kafka、RabbitMQ
- 关系型数据库DB:比如ActiveMQ、MySql
- 从存储效率来说, 文件系统 > 分布式KV存储 > 关系型数据库DB。直接操作文件系统是最快和最高效的,而关系型数据库TPS一般相比于分布式KV系统会更低一些。
Redis能替代Mysql吗?简单说说为什么不能? 1.redis基于内存,虽然有持久化机制,但是断电之后也可能出现数据丢失情况 2.redis不支持多并发环境下的事务隔离级别 3.redis不支持关系型数据库的建表规范(数据库三范式)