分布式服务的幂等性设计

 目录

  • 网上有各种语言实现的Snowflake算法的实现,有兴趣的阅读一下实现代码。

    实际上,redis 或是 mongoDB 的全局ID生成器的算法和Snowflake算法大同小异。这是基于redis的分布式ID生成器实现:https://github.com/hengyunabc/redis-id-generator

    它的核心思想是:

    • 使用41 bit来存放时间,精确到毫秒,可以使用41年。
    • 使用12 bit来存放逻辑分片ID,最大分片ID是4095
    • 使用10 bit来存放自增长ID,意味着每个节点,每毫秒最多可以生成1024个ID

    共享存储

    如果我们的幂等性服务是分布式的,那么存储唯一ID也需要采用共享的存储,这样每个服务就是无状态的了。可以使用mysql来存储,也可以使用k-v存储例如redis。我在自己的业务中就采用了redis来存储唯一key。

    避免不必要的查询

    并不是所有的请求都是重复的,生产环境下可能99%的请求都不是重复请求。如果每个请求在执行前都要去查询下唯一ID是否存在,可能会带来不必要的性能消耗。如果你使用mysql来存储唯一ID,那么可以直接进行insert,通过结果来判断是否插入记录成功,如果不成功则证明ID已经存在:

    insert into ... values ... on DUPLICATE KEY UPDATE ...

    而如果使用的是redis,也可以使用redis的setEx,设置成功则证明key不存在,否则key存在说明是重复请求。https://www.cnblogs.com/QG-whz/p/10372458.html

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信