Posted by lily's blog on May 9, 2025

面试问题

文章:

  1. lottery面试问题

项目亮点总览

项目描述:本抽奖系统是智动社区的扩展服务,本项目以使用和调用美团、京东、字节掘金的抽奖场景服务,负责提供各种抽奖活动,定期对平台活跃度高、贡献度大的用户奖励抽奖资格,从而提高整个平台用户的活跃度和积极性。同时将该系统与微信公众号进行对接,为用户提供方便快捷的抽奖体验。

后端技术:Spring Boot、Sharding-JDBC、Mybatis、Dubbo、MySQL、XXL-Job、Kafka、Zookeeper。 

核心工作:

  1. DDD架构设计:分解出活动、奖品、抽奖策略领域,抽象出抽奖流程,分为抽奖前中后,并对各节点拓展各种行为动作。如抽奖前的人群判断,抽奖中库存扣减,抽奖后兜底奖励等。
  2. 分库分表:考虑到抽奖系统的高并发吞吐量,采用分库分表组件,并使用该组件进行以用户ID为切分的路由操作。
  3. 缓存优化:使用布隆过滤器来过滤大量非法的数据请求,使用逻辑过期来预防热点Key访问导致的缓存击穿。
  4. 流量承接:针对抽奖活动的并发场景,借鉴 ConcurrentHashMap 分段锁的思想,从独占竞态锁结合库存编号优化为分段竞态锁,细化了锁的粒度,将抢锁失败率从90.66%降低到1.33%,显著提升了系统的性能和用户体验。
  5. 业务一致性校验:对账户额度订单等的关键操作配置幂等校验。在抽奖完成后将任务写入 task 表,并设置定时任务扫描 task 表发送 MQ 消息通知奖品发货,用户中奖流水和负责发送MQ的task任务由定时任务扫捕更改状态,保证业务最终一致性。
  6. 人群细分引擎:依据系统内年龄、性别、等级、贡献度等规则策略过滤,搭建了去中心化的量化人群规则引擎组件([[2024-03-11-Lottery抽奖系统]]——见【规则引擎——决策树】模块),完成自由组合的人群过滤服务,控制运营成本及精细化运营。

业务一致性校验

redis高可用

  1. redis服务崩了数据直接打到服务器怎么办
    1. 简答:【核心】缓存、扩容、加机器
      1. 合理条件下重启mysql服务器
      2. 恢复时做好服务降级、熔断处理
        1. 降级后的数据恢复处理
    2. 程序员主要还是在技术层面关注预防
    3. redis高可用
      1. 主从、哨兵、集群
        1. 主从、集群:运维处理
      2. 配置过程:应对redis集群崩溃方法
        1. 使用
      3. 哨兵选举主节点过程
    4. redis缓存失效预防
      1. 击穿、穿透、雪崩
      2. 布隆过滤器

        布隆过滤器

为什么使用布隆过滤器

【缓存优化:使用布隆过滤器来过滤大量非法的数据请求】 我们使用布隆过滤器来记录存储所有可执行抽奖的策略、抽奖活动、用户抽奖结果表数据的key值,这些数据数据体量不大并且更新频率不高,使用布隆过滤器进行一次全量数据的记录后,不需要对过滤器进行多次扩容操作,并且有效预防了缓存穿透的情况,使用较低的成本就能保障数据库的稳定性和安全性。

布隆过滤器原理

原理+场景 布隆过滤器前置知识:布谷鸟过滤器原理

弊端

考虑更换布谷鸟过滤器 布谷鸟过滤器原理

布隆过滤器使用

  1. 单机版guava包下引入布隆过滤器
  2. 使用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不支持关系型数据库的建表规范(数据库三范式)