购物车行号雪花算法改造工作

购物车行号雪花算法改造工作


术语

  1. 车1:也称“购物车”,是你将商品加入购物车、点击购物车图标时展示给你的购物车;

    车1主流程:车1加入、车1展示、、车1修改、去结算

  2. 车1加入:对加入购物车的商品做出一系列校验(寻源、有无货)后,进行同品合并,存入车1表中

    车1加入调寻源时,车行号暂时是传空的,直到入库时才分配车行号

  3. 车1展示:从车1表中查询购物车信息并展示,主要是商品主信息

  4. 去结算:在车1界面点击“结算”,跳转到车2的流程 —— 将购物车车信息、商品行信息、配送方式、发票信息保存到车2表中

  5. 车2:也称“结算车”,是你在购物车界面选择商品、点击“结算”后生成的包含商品详细信息列表的车;

    车2主流程:车2展示、车2修改、配送保存、送货时效保存、提交订单、预售立即购

  6. 车2展示:从车2表中查询并展示信息,包括地址信息、配送方式信息(自提/送货……)、商品主信息(价格、规格……)、支付方式、卡信息、券信息、云钻信息、奖励金信息、发票信息……

  7. 提交订单:在车2界面点击“提交订单”后,生成待付款的新订单,此后的流程交由订单部门负责;

  8. 临时车:一种特殊的车1,用户没有登陆时,将商品加入购物车,加入的就是临时车,临时车点击“结算”时会要求用户登录,否则无法继续

  9. 车行号:每一个购物车都有自己全局唯一的ID,记作cartNo,用于标志每一个车

  10. 公共库:车1存储在车1库,车2存储在车2库,一些公共的信息存储在公共库


cartNo原方案

  1. cartNo一共18位,除了标志车1/车2/临时车的标志位、一些填充位外,主要部分是MySQL单表的自增ID
  2. MySQL单表自增ID通过号段 + JVM缓存进行了优化:每次从MySQL获取一批号段缓存在JVM,然后通过Semaphore进行线程安全的递增

具体方案可以参考《分布式全局唯一ID方案 - MySQL号段模式》


存在的问题

  • 没有解决使用单一MySQL带来的单点问题
  • MySQL自增ID使用的是int而非bigint,面临着用完的风险

cartNo改造

  1. 首先将雪花算法获取的64long类型 ID 转为19位的String

    Long.MAX_VALUE = 2 ^ 63 - 1 = 9223372036854775807,最多19

  2. 需要2位的标志位,用于区分车1、车2、临时车、订单

  3. 需要1位的机房号,由于目前只有双机房,所以1位就足够

  4. 需要2位的unit分库号

  5. cartNo一共24位:2位标志位 + 1位机房号 + 2位unit分库号 + 19位雪花算法ID

-------------本文结束感谢您的阅读-------------

本文标题:购物车行号雪花算法改造工作

文章作者:DragonBaby308

发布时间:2019年09月11日 - 22:53

最后更新:2020年01月16日 - 22:26

原始链接:http://www.dragonbaby308.com/cartNo-snowflake/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%