美文网首页MySQL
如何保证服务幂等性?

如何保证服务幂等性?

作者: LANSHENGYANG | 来源:发表于2019-12-03 09:19 被阅读0次

    1、概念:接口的幂等性实际上就是接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是-致的。有些接口可以天然的实现幂等性,比如查询接口,对于查询来说,你查询一次和两次,对于系统来说,没有任何影响,查出的结果也是一样。
    2、GET幂等:值得注意,幂等性指的是作用于结果而非资源本身。怎么理解呢?例如,这个HTTP GET方法可能会每次得到不同的返回内容,但并不影响资源。
    3、POST非幂等:因为它会对资源本身产生影响,每次调用都会有新的资源产生,因此不满足幂等性。

    如何保证幂等性:

    • 1、全局唯一id:如果使用全局唯- -ID, 就是根据业务的操作和内容生成一一个全局ID, 在执行操作前先根据这个全局唯- -ID是否存在,来判断这个操作是否已经执行。如果不存在则把全局ID,存储到存储系统中,比如数据库、redis等。 如果存在则表示该方法已经执行。
      从工程的角度来说,使用全局ID做幂等可以作为一个业务的基础的微服务存在,在很多的微服务中都会用到这样的服务,在每个微服务中都完成这样的功能,会存在工作量重复。另外打造一-个高可靠的幂等服务还需要考虑很多问题,比如一台机器虽然把全局ID先写入了存储,但是在写入之后挂了,这就需要引入全局ID的超时机制。
      使用全局唯一-ID是一个通用方案,可以支持插入、更新、删除业务操作。但是这个方案看起来很美但是实现起来比较麻烦,下面的方案适用于特定的场景,但是实现起来比较简单。
    • 2、去重表:这种方法适用于在业务中有唯-标的插入场景中,比如在以上的支付场景中,如果-一个订单只会支付一次,所以订单ID可以作为唯一标识。 这时,我们就可以建一张去重表, 并且把唯一标识作为唯一 索引, 在我们实现时,把创建支付单据和写入去去重表,放在一个事务中,如果重复创建,数据库会抛出唯一约束异常,操作就会回滚。
    • 3、插入或更新:这种方法插入并且有唯一索引的情况, 比如我们要关联商品品类,其中商品的ID和品类的ID可以构成唯一索引,并且在数据表中也增加了唯一索引。这时就可以使用InsertOrUpdate操作。在mysql数据库中如下:
    insert into goods_category (goods_id,category_id,create_time,update_time)
    values(#{goodsId},#{categoryId},now(),now())
    on DUPLICATE KEY UPDATE
    update_time=now()
    

    相关文章

      网友评论

        本文标题:如何保证服务幂等性?

        本文链接:https://www.haomeiwen.com/subject/rloqgctx.html