昨晚在直播间带着大家刷第 22 套小米面试真题时,遇到了这样一个问题,面试官问:“你在开发电商系统的过程中,都遇到了哪些问题?”,个人觉得这个问题既属于开放性问题,同时又比较具有代表性,所以就单拿出来和大家分享交流一下经验。
首先,我们先分析一下,电商系统开发中可能会遇到的经典的问题有哪些?我这总结了几个,大家也可以在评论区补充交流:
- 瞬时流量,高并发问题。
- 库存问题:超卖和少卖问题。
- 弱网环境下支付问题。
- 黄牛刷单问题。
- 重复订单去重问题。
这是我们在电商系统开发中,可能会遇到的一些经典问题,那怎么来解决这些问题呢?
1.解决高并发问题
高并发系统有以下三个经典的解决方案:
- 缓存:一种重要的计算机技术,它通过减少数据访问时间和提高数据访问速度来优化系统查询的效率。
- 限流:一种计算机网络流量控制技术,主要用于控制数据的传输速率,防止网络拥堵和超出系统的处理能力。通过限流可以控制单位时间内请求的数量,或者限制一个时间窗口内的请求数量,以保护系统的稳定性和可用性。
- 熔断:一种在分布式系统中用于处理故障和防止系统过载的保护机制。它的主要思想源于电路中的熔断器,当电流过大时,熔断器会自动熔断以保护电路。在分布式系统中,熔断器的概念被引申为保护系统免受过多错误或请求的冲击。
具体的落地实现:
- 缓存具体实现:使用 Redis 实现分布式缓存,另外配合 Nginx 缓存 + 本地 Caffeine 缓存 + CDN 缓存 + 浏览器缓存共同实现多级缓存来保证系统的性能。
- 限流具体实现:限流可以使用 Spring Cloud Alibaba 组件 Sentinel 来实现,在项目中引入 Sentinel 框架,配置资源和资源限流规则即可实现限流功能。
- 熔断具体实现:熔断的实现和限流类似,也可以使用 Spring Cloud Alibaba 组件 Sentinel 来实现,在项目中引入 Sentinel 框架,配置资源和资源熔断规则即可实现限流功能。
2.解决库存问题
库存的问题有两个:
- 超卖问题
- 少卖问题
2.1 解决超卖问题
超卖问题的解决方案有以下几个:
- 限流
- 分布式锁
- Redis Lua(先判断库存 -> 减库存 + 加订单)
- 使用数据库 update 操作库存
PS:生产环境通常使用限流 + Redis Lua 脚本来解决超卖问题。
2.2 解决少卖问题
少卖问题我们通常使用及时对账系统 + 人工补偿机制来解决。
3.解决弱网支付问题
弱网环境下支付的问题主要涉及到在网络信号较差的情况下进行支付操作时可能出现的一系列问题。
弱网环境最主要的是要解决支付状态同步的问题,它的解决方案有以下几个:
- 支付平台提供回调方法进行支付状态的刷新。
- 手动触发主动出查询得到支付状态。
- 定时任务进行刷新。
4.解决刷单问题
防止黄牛刷单的常见解决方案有以下两种:
- 添加图形验证码:此手段可以解决大部分刷单问题。
- 添加异常观测平台和 IP 黑名单限制:通过异常报警平台观察到异常 IP,然后将异常 IP,加入到 IP 黑名单,从而解决刷单问题。
5.解决重复订单问题
重复订单去重问题的解决方案有以下两个:
- 通过幂等性判断去除重复订单:可以通过自定义注解 + Redis 来实现幂等性过滤。
- 数据库唯一约束保底:数据库通过设置唯一约束来保证不会有重复的订单添加到数据库,从而避免了重复订单的产生。
课后思考
除了以上问题之后,你在开发电商系统中还遇到了哪些经典的问题?幂等性判断的核心实现代码是啥?自定义注解的实现方式有几种?