开发者社区> 问答> 正文

分布式环境如何保证外部订单号唯一?? 400 报错

分布式环境如何保证外部订单号唯一?? 400 报错

类似于支付宝,服务端在接收支付请求时,要求客户端在请求中传入外部订单号,此外部订单号要保证唯一性,服务端在分布式部署环境下,想到利用redis得setnx命令来判断,返回1,表示外部订单号唯一。这种方式对redis的压力比较大,请问下大家有更好的方式没有?

展开
收起
爱吃鱼的程序员 2020-06-05 12:37:05 719 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    我们是先生成订单号存到redis######外部订单号是第三方传入的,不是本平台那个订单号######

    可以在生成的单号中,加入应用服务器的编号(自定义的),再加上几位随机数。

    年月日时分秒+机器编号+随机树,至于长度,自己定义吧.、

    这样可绝对的不会重复了.

    加锁太浪费性能了,尽量避免使用锁!

    ######我说的是外部订单号,是第三方传入的,和支付宝类似,支付宝要求提交订单的时候,第三方要传入一个唯一的字符串,支付宝的量如此大,它是怎么判断第三方传入这个字符串唯一的######

    redis集群啊

    ######是外部订单号######

    进程id+电脑mac地址+时间毫秒数+一个多位循环数字。 这样出来的订单号是绝对不会重复的。

    楼上说随机数的,随机数如果同一主机同一进程同一毫秒内随机数出现相同你就出BUG了。

    ######回复 @高端大气上档次_ : 对头,要求所有商户订单号全局唯一,没意义!######外部传入的订单号 支付宝只判断在当前商户下没有重复的就行######我说的是外部订单号,是第三方传入的,和支付宝类似,支付宝要求提交订单的时候,第三方要传入一个唯一的字符串,支付宝的量如此大,它是怎么判断第三方传入这个字符串唯一的?######

     

        从技术上来说先做数据分区缓存,摘要计算上报的订单号,在相应的分区内去查询是否存在,如果划分了商户,则以商户key和上报的订单号摘要查询是否存在。这种不重复的级别不需要全局不重复,按照商户不重复我觉得应该可以,看业务要求。

        从业务来说可以强制性要求第三方上报的必须不重复,否则产生的后果商户自己承担,譬如转错账、扣错款之类的,不过本着客户是上帝的理念,这样做就不太符合这个理念了。

     

    ######分区后减轻了整个压力,通过业务算法提高了性能,这种方法比较合适,谢谢######

    snowflake算法

    ######

    redis集群部署啊,对同一个来源的订单,通过一致性hash,分配到对应的redis集群上,这样应该会减去redis的压力吧

    2020-06-05 12:37:19
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
基于社区的分布式 风险感知模型 立即下载
如何利用Redisson分布式化传统Web项目 立即下载
FLASH:大规模分布式图计算引擎及应用 立即下载