# miaosha **Repository Path**: a853160447/miaosha ## Basic Information - **Project Name**: miaosha - **Description**: 秒杀实战 - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-08 - **Last Updated**: 2022-06-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 秒杀实战 服务调用的无状态 下单之间实现幂等 url链接隐藏 防止一个客户多个下单 一、预热工作 1.像订单状态信息和商品信息,商品库存信息,可以建立热点数据,预先设置到缓存(缓存可以是redis)。 二、点击购买页面 1.防止ip的重复点击,可以用redis的布隆过滤器{防止多次点击,多次下单}(保证高可用问题) 2.可以根据系统的承受能力或着库存的量,将大量的请求挡在外面,也可以设置消息队列的最大阈值,这样已经挡住了大量的请求。{防止大量的肉鸡或者真正的量太大,导致系统崩溃}(高可用问题) 3.为了安全考虑会隐藏秒杀url,或给秒杀的url加上盐,然后通过后台校验盐的正确性。 三、异步下单 1.判断库存是否充足,充足的情况进行异步下单,异步下单可以通过消息队列去创建订单,同时可以返回创建订单成功的提示(速度快、体验好),消息队列有消峰的作用,而且可以保证流量的平滑过渡,而且用消息队列非常有利于水平横向的扩展,速度不会慢。 有些实现会在这里进行库存的预先扣减,如果这里先扣减,会导致redis和mysql的库存不一致的情况,需要设置定时器定时去同步库存订单信息。 2.消息队列接收消息,判断库存是否充足,预先扣减库存(这里也要保证原子性),然后创建订单,更新缓存信息。 ## 原子性保证可以用redis的lua ## 可以用数据库的乐观锁(库存变化太快,所以不太适用) ## 如果是分布式系统,要用到分布式锁 3.前端通过轮询订单是否创建成功,如果订单状态是0,则提示订单创建中或排队中,如果是1表示订单创建成功,如果是-1则表示秒杀失败。如果创建成功则调用发起支付api进行支付。 有些实现会直接发起支付,这时候订单因为是异步的,订单可能会创建失败,也可能会还没创建完,这样也需要在服务端设置定时去更新订单状态。 ## 超卖 ## 少买 ## Restful API设计风格 优化: dbsource写在配置之中