随着互联网的发展,后台服务的承载量越来越大,性能多高的单台机器也无法满足无限制增长的承载量,同时互联网业务的特点往往要求服务快速扩容,如此这些特点,使得现在的后台架构越来越复杂。完全从单机演化到分布式系统。分布式系统常常使用RPC技术作为其通信基础,RPC与传统的单机版过程/函数调用不同,传统的单机函数调用,不是成功就是失败;而RPC却不只是是与非的问题,它又引入了第三态,超时(timeout),超时的情况下,可能成功,也可能失败,换句话说,RPC的结果是未知的,超时情况下,可能会重试,这时候,接口的幂等性就是非常重要的了。
为了理解接口的幂等性,我们先举一个例子: 对于一个电商系统,常常会涉及到扣减库存的问题,场景如下:
下边我们就研究下如何设计具有幂等性接口的函数/接口。 现在假设这个接口的名字为sub_stock。我们如何完善接口的幂等性呢?这里借鉴金融系统的做法,引入 票据(token) 是个不错的主意:
当然了,sub_stock(token, sub_num)在执行时,将验证token、标记为已执行,和扣减库存这三步是原子操作。 可见在分布式系统中生成一个全局唯一的id是非常重要的,如下介绍几种:
常见分布式ID开源框架:
美团的Leaf项目,百度的UIDGenerator,还有滴滴的tinyid