分布式环境如何保证外部订单号唯一?? 400 报错
类似于支付宝,服务端在接收支付请求时,要求客户端在请求中传入外部订单号,此外部订单号要保证唯一性,服务端在分布式部署环境下,想到利用redis得setnx命令来判断,返回1,表示外部订单号唯一。这种方式对redis的压力比较大,请问下大家有更好的方式没有?
我们是先生成订单号存到redis######外部订单号是第三方传入的,不是本平台那个订单号######
可以在生成的单号中,加入应用服务器的编号(自定义的),再加上几位随机数。
年月日时分秒+机器编号+随机树,至于长度,自己定义吧.、
这样可绝对的不会重复了.
加锁太浪费性能了,尽量避免使用锁!
######我说的是外部订单号,是第三方传入的,和支付宝类似,支付宝要求提交订单的时候,第三方要传入一个唯一的字符串,支付宝的量如此大,它是怎么判断第三方传入这个字符串唯一的######redis集群啊
######是外部订单号######进程id+电脑mac地址+时间毫秒数+一个多位循环数字。 这样出来的订单号是绝对不会重复的。
楼上说随机数的,随机数如果同一主机同一进程同一毫秒内随机数出现相同你就出BUG了。
######回复 @高端大气上档次_ : 对头,要求所有商户订单号全局唯一,没意义!######外部传入的订单号 支付宝只判断在当前商户下没有重复的就行######我说的是外部订单号,是第三方传入的,和支付宝类似,支付宝要求提交订单的时候,第三方要传入一个唯一的字符串,支付宝的量如此大,它是怎么判断第三方传入这个字符串唯一的?######
从技术上来说先做数据分区缓存,摘要计算上报的订单号,在相应的分区内去查询是否存在,如果划分了商户,则以商户key和上报的订单号摘要查询是否存在。这种不重复的级别不需要全局不重复,按照商户不重复我觉得应该可以,看业务要求。
从业务来说可以强制性要求第三方上报的必须不重复,否则产生的后果商户自己承担,譬如转错账、扣错款之类的,不过本着客户是上帝的理念,这样做就不太符合这个理念了。
######分区后减轻了整个压力,通过业务算法提高了性能,这种方法比较合适,谢谢######
snowflake算法
######redis集群部署啊,对同一个来源的订单,通过一致性hash,分配到对应的redis集群上,这样应该会减去redis的压力吧
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。