华人澳洲中文论坛

热图推荐

    一个反对百万QPS的通用库存设计计划

    [复制链接]

    2023-3-8 19:33:09 39 0



    前言
    软件开发中,常常会波及到一个对于库存的概念,简略来说,就是某些产品能够扣减的额度,如红包的余额,优惠券的数量,等等。这个看似一个简略的统计变量,在QPS特别高的时分,如百万级别的,假如没有良好的设计,就有可能成为零碎的瓶颈,好比可能会致使上述说的虚构资产红包、优惠券等发送失败,或者说用户支付失败。
    如何设计一个通用,可扩展性好,反对程度扩容的存库构造呢,这就是本文要分享的内容了。
    存储数据库
    库存作为一个变量,而且要同享到多台机器上(集群),那末他就需求存储到一个数据库中,那末数据库如何选择呢?
    1.MySQL
    咱们脑海中可能一闪而过的动机,就是存储到MySQL中。MySQL作为较根底的数据库,在用户范围不高的状况下,万物皆可存储。但是理论标明,一个16C32G内存的数据库,顶多也就5000多的QPS,这远远无奈知足咱们要的百万QPS的需要,虽然能够经过分库分表来摊派压力,然而需求的数据库过量,硬件本钱也是过高了,所以不合适。


    2.Redis
    Redis也是一个很常见的数据库,得多人可能简略地拿它来做缓存罢了,其实它的用户仍是很广的,这得益于它又几个特征。
    首先,它是基于内存的,速度特别得快,民间数据标明单机Redis在衔接数不高的状况下,能够反对10w的QPS,这离咱们的指标很近了。


    其次,Redis是复线程的,咱们就能不必斟酌并发的状况下,扣减库存时,写Redis时的线程平安问题了,省去了加锁解锁的操作。
    综上所述,咱们选择的存储数据库是Redis。
    存储构造
    咱们知道Redis单机反对10w的QPS,间隔咱们的指标还有点间隔,而解决这个间隔的计划,就是使用Redis集群。假如每个Redis单机分担10w的QPS的话,10个Redis节点组成的Redis集群,就能反对百万级别的QPS了。
    既然Redis经过集群部署,那末库存天然也得扩散到各个Redis节点,咱们能够做整除,区别每个节点都分到相应的数量,再做取余,将无奈均匀的数量,追加到其中的一个节点。


    5%2、5/2
    扣减的时分,假如单分片反对扣减库存,就能间接前往了,假如不敷的话,再从其余分片获得量进行扣减。
    出产环境,还会做得多的优化:
    如当分片的残余库存数量为0的时分,能够打上一个标识,使下次遍历分片库存的时分跳过该分片,节俭无用的计算逻辑。如在遍历分片的时分,为了不单分片热点,先将分片程序打乱,再进行库存遍历。以上,等等。
    程度扩容
    咱们的库存如今是反对100w的QPS了,然而万一业务要求反对1000w级别的QPS,那末咱们的计划是不是需求大改呢?


    显著是不必大改,咱们只需求将库存分片的数量减少便可。咱们能够根据原本的逻辑运转顺序,它将会把库存扩散到更多的节点罢了。如斯一来,咱们的分片从10程度扩容到100分片,根本就可以知足业务的从100w的QPS到1000w的QPS的需要了。
    最初
    本文咱们分享了一个通用的库存设计计划,它能够经过程度扩容,反对高并发的业务场景,笔者有空再分享实际业务相干的通用设计计划。

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    返回列表 本版积分规则

    :
    注册会员
    :
    论坛短信
    :
    未填写
    :
    未填写
    :
    未填写

    主题28

    帖子33

    积分156

    图文推荐