《微服务设计》读书笔记

开始于 2020 年 3 月 8 日


Table of contents

幂等

幂等的含义是,一个调用被发送多次所产生的总的副作用和被发送一次所产生的副作用是一样的。服务间的调用会有三种结果:成功、失败和超时。前两者是明确的状态,而超时则是完全不知道是什么状态。

比如,超时原因是网络传输丢包的问题,可能是请求时就没有请求到,也有可能是请求到了,返回结果时没有返回到等情况。于是我们完不知道下游系统是否收到了请求,而收到了请求是否处理了,成功/失败的状态在返回时是否遇到了网络问题。总之,请求方完全不知道是怎么回事。

在这种情况下,一般有两种处理方式:

  • 一种是需要下游系统提供相应的查询接口。上游系统在 timeout 后去查询一下。如果查到了,就表明已经做了,成功了就不用做了,失败了就走失败流程。
  • 另一种是通过幂等性的方式。也就是说,把这个查询操作交给下游系统,我上游系统只管重试,下游系统保证一次和多次的请求结果是一样的。

对于第一种方式,需要对方提供一个查询接口来做配合。而第二种方式则需要下游的系统提供支持幂等性的接口。

要做到幂等性的接口,需要有一个唯一的标识,来标志多次请求为同一个请求。

在全局唯一 ID 的算法中,介绍 Twitter 的开源项目 Snowflake。它是一个分布式 ID 的生成算法。其核心思想是,产生一个 long 型的 ID,其中:

  • 41bits 作为毫秒数。大概可以用 69.7 年;
  • 10bits 作为机器编号(5bits 是数据中心,5bits 的机器 ID),支持 1024 个实例;
  • 12bits 作为毫秒内的序列号。一毫秒可以生成 4096 个序号。

版权声明

本作品采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接。