P12-总结(副本)

155 阅读2分钟

image.png

限制同一用户访问次数

image.png

限流器底层算法

令牌桶算法

可能会有突发流量,处理速度有波峰波谷。但不会长期。

之前一直没有请求,桶满。突然来一大波流量,消耗掉了所有令牌,业务组件承担一波突发流量。波峰过后正常,每秒十个请求

image.png

漏桶算法

服务器压力稳定,处理请求的速度恒定

image.png

并发问题

表结构设计

秒杀项目主要涉及7张表,其核心是用户表、商品表、订单表:

  1. 用户表(user_info)
    手机号作为用户名,密码存储的是密文,采用MD5加密。
  2. 商品表(item)
    商品名称,价格,图片链接,存储的是绝对路径(HTTP),描述存储的是富文本信息(HTML)。
  3. 库存表(item_stock)
    与商品表是多对一关系,将库存从商品表拆分出来,是为了减小修改库存时锁的粒度。
  4. 活动表(promotion)
    与商品表是一对一关系,一个商品只能参与一个活动,我们对秒杀业务模型做了精简的。
  5. 订单表(order_info)
    与商品表是多对一关系,订单中记录了下单时的单价、数量、金额,相当于商品在下单一刻的快照。
  6. 序列表(serial_number)
    用于记录订单等业务场景中的序列号,分别存储了业务名称、当前序号、增长步长。
    生成序号时必须严格互斥,不能采用非锁定读(MVCC),所以我们按订单为维度来生成序号,竞争很大。
    这里可以做进一步优化,比如增加商品列、用户列、服务器列等,将单一的订单维度拆分为更多维度
    随着维度(粒度)的降低,竞争便会缩小。当然,也可以考虑不用此表生成序列,而是采用雪花算法(百度一下)。
  7. 库存流水表(item_stock_log)
    用户记录商品在下单时的状态流转情况,便于追溯订单的状态,从而为MQ回查订单状态提供依据。
    库存流水表与商品表是多对一关系,记录了商品ID、扣减数量、订单状态。

超卖

下单时锁库存、超时释放订单回补库存,解决超卖问题。分布式锁防止超卖

重复下单

重复消费问题