听说你会架构设计?( 三 )

  • 大量无效的更新请求和事务回滚,可能给 DB 造成额外的压力,拖慢处理性能 。
  • 总的来说 , 乐观锁适用于数据竞争?。?冲突较少的业务场景,而悲观锁也不适用于高并发场景的数据更新 。
    因此对于抢红包系统来说,加锁是非常不适合的 。
     
    3、异步分治综上所述,抢红包时不仅要解决高并发问题、还得保障并发的顺序性,所以我们考虑从队列的角度来设计 。
    我们知道,每次包红包、发红包、抢红包时,也有先后依赖关系,因此我们可以将红包 ID 作为一个唯一 Key,将发一次红包看作一个单独的 set,各个 set 相互独立处理 。
    听说你会架构设计?

    文章插图
    图片
    这样 , 我们就把海量的抢红包系统分成一个个的小型秒杀系统 , 在调度处理中,通过对红包 ID 哈希取模 , 将一个个请求打到多台服务器上解耦处理 。
    然后,为了保证每个用户抢红包的先后顺序,我们把一个红包相关的操作串行起来,放到一个队列里面,依次消费 。
    从上述 set 分流我们可以看出 , 一台服务器可能会同时处理多个红包的操作,所以,为了保证消费者处理 DB 不被高并发打崩,我们还需要在消费队列时用缓存来限制并发消费数量 。
    抢红包业务消费时由于不存储数据 , 只是用缓存来控制并发 。所以我们可以选用大数据量下性能更好的 Memcached 。
    除此之外 , 在数据存储上,我们可以用红包 ID 进行哈希分表,用时间维度对 DB 进行冷热分离,以此来提升单 set 的处理性能 。
    综上所述 , 抢红包系统在解决高并发问题上采用了 set 分治、串行化队列、双维度分库分表 等方案,使得单组 DB 的并发性能得到了有效提升,在应对数亿级用户请求时取得了良好的效果 。
     
    4.2 红包分配算法抢红包后,我们需要进行拆红包,接下来我们讨论一下红包系统的红包分配算法 。
    红包金额分配时 , 由于是随机分配 , 所以有两种实现方案:实时拆分和预先生成 。
     
    1、实时拆分实时拆分,指的是在抢红包时实时计算每个红包的金额,以实现红包的拆分过程 。
    这个对系统性能和拆分算法要求较高,例如拆分过程要一直保证后续待拆分红包的金额不能为空,不容易做到拆分的红包金额服从正态分布规律 。
     
    2、预先生成预先生成,指的是在红包开抢之前已经完成了红包的金额拆分,抢红包时只是依次取出拆分好的红包金额 。
    这种方式对拆分算法要求较低,可以拆分出随机性很好的红包金额,但通常需要结合队列使用 。
     
    3、二倍均值法综合上述优缺点考虑 , 以及微信群聊中的人数不多(目前最高 500 人) , 所以我们采用实时拆分的方式 , 用二倍均值法来生成随机红包,只满足随机即可 , 不需要正态分布 。
    故可能出现很大的红包差额,但这更刺激不是吗
    【听说你会架构设计?】


    推荐阅读