分布式环境如何保证外部订单号唯一?? 400 报错-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

爱吃鱼的程序员 2020-06-05 12:37:05 110

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

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

NoSQL Redis
分享到
取消 提交回答
全部回答(1)
  • 爱吃鱼的程序员
    2020-06-05 12:37:19

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

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

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

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

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

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

    redis集群啊

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

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

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

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

     

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

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

     

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

    snowflake算法

    ######

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

    0 0
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

推荐文章
相似问题