7
回答
分布式环境如何保证外部订单号唯一?

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

<无标签>
举报
copy202
发帖于6个月前 7回/770阅

以下是问题补充:

  • @copy202 :可能描述不清楚,补充下,问题是平台如何判断第三方传入的订单号唯一 (6个月前)

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

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

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

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

--- 共有 1 条评论 ---
copy202我说的是外部订单号,是第三方传入的,和支付宝类似,支付宝要求提交订单的时候,第三方要传入一个唯一的字符串,支付宝的量如此大,它是怎么判断第三方传入这个字符串唯一的 6个月前 回复

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

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

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

 

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

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

 

--- 共有 1 条评论 ---
copy202 分区后减轻了整个压力,通过业务算法提高了性能,这种方法比较合适,谢谢 6个月前 回复

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

顶部