博客
关于我
幂等性
阅读量:639 次
发布时间:2019-03-15

本文共 1565 字,大约阅读时间需要 5 分钟。

幂等性是分布式系统中保证业务操作的原子性特性,确保在高并发场景下同一业务操作的结果唯一性和一致性。为了有效处理幂等性,技术和架构设计通常采用多种方式来保证操作的最终一致性。

1. 幂等性在分布式系统中的重要性

在分布式系统中,由于节点可能存在故障或者网络延迟,直接通过简单的操作即可完成的事务性工作变得难以实现。幂等性是解决这一问题的重要手段,确保在业务操作过程中,每个节点只能处理一次请求,避免重复处理造成的数据不一致。

2. 幂等性技术方案详解

为了实现幂等性,通常采用以下技术手段:

2.1. 悲观锁

通过数据库的 for update 实现锁定机制,确保数据在被修改期间保持独占访问。具体操作如下:

  • 数据库层面执行 select * from table where id='xxx' for update,锁定特定记录。
  • 因为 for update锁定的是记录锁,且事务级锁会在提交事务前自动释放。
  • 优点:简单易实现,效率高。
  • 缺点:长时间锁占用会导致系统性能下降,尤其在处理事务频繁或逻辑复杂的业务时。

2.2. 乐观锁

通过数据库版本号机制,使得多个节点可以乐观地进行事务操作,最终由数据库保证事务一致性。具体步骤如下:

  • 查询记录时附加条件 version=expected_version,确保数据版本一致。
  • 在事务提交前,将版本号加1,避免其他节点操作同一数据。
  • 优点:并发处理效率高。
  • 缺点:可能因为版本不一致导致事务回滚,但这种情况较少。

2.3. 唯一索引

通过数据库唯一约束,防止重复操作造成的数据不一致。具体实现方式:

  • 创建唯一约束索引,如 unique(ref_type, ref_id)
  • 新增操作时检查索引是否存在,若已存在则直接返回,避免重复操作。
  • 优点:操作简单,效果直观。
  • 缺点:插入操作可能成为性能瓶颈,尤其是高并发场景下。

2.4. 分布式锁

利用分布式锁实现多节点间的资源竞争。常用的方案是Redis锁:

  • Redis RedLock 算法,通过多节点的获取锁和释锁流程实现分布式锁。
  • 方案流程:尝试获取锁,若失败则等待或超时退出;成功后执行业务,最后释放锁。
  • 优点:适用于分布式环境,可靠性高。
  • 缺点:锁的获取和释放复杂度高。

3. 案例分析:支付宝充值功能

在支付宝支付成功回调接口中,需确保同一交易号在多个支付处理节点的ापस处理不重复。以下是几种实现方式:

3.1. JVM 内锁

使用 Java 的 Lock 或其他 JVM 内锁实现方式,特点为:

  • 适用于同一 JVM 中的多线程竞争。
  • 需注意集群环境下锁不跨节点。

3.2. 数据库悲观锁

通过执行 select * from t_order where trade_no = x for update,加锁处理,再执行业务逻辑。

特点:

  • 强一致性。
  • 可能导致长时间等待,影响系统性能。

3.3. 乐观锁

通过在每次操作前检查版本号,确保数据不被其他节点修改。

程序流程:

  • 查询订单信息,附加版本条件。
  • 若版本一致,继续处理,否则直接返回。
  • 处理完成后,更新版本号。
  • 提交事务。
  • 3.4. 唯一索引机制

    通过在处理前的检查插入,若表中已有记录,则标记为处理。

    插入语句:insert into t_dipose (ref_type, ref_id) values ('充值订单', trade_no)执行成功则事务提交,否则回滚。

    4. 总结

    在分布式系统中,实现幂等性需要综合考虑以下几个方面:

  • 选择合适的锁机制,根据业务场景选择最优方案。
  • 在系统架构中合理部署锁机制,避免热点问题。
  • 建立监控和警报机制,及时发现锁masse Blockage。
  • 对于支付宝充值功能,采用 Redis 分布式锁方案最为可靠,兼顾性能优化。

    转载地址:http://xhalz.baihongyu.com/

    你可能感兴趣的文章
    成功解决升级virtualenv报错问题
    查看>>
    【SQLI-Lab】靶场搭建
    查看>>
    【Bootstrap5】精细学习记录
    查看>>
    Struts2-从值栈获取list集合数据(三种方式)
    查看>>
    参考图像
    查看>>
    *.json: [“usingComponents“][“van-button“] 未找到
    查看>>
    设计模式(18)——中介者模式
    查看>>
    error LNK2019:无法解析的外部符号_imp_CryptAcquireContextA@20
    查看>>
    推荐几篇近期必看的视觉综述,含GAN、Transformer、人脸超分辨、遥感等
    查看>>
    BUU-MISC-caesar
    查看>>
    【专题3:电子工程师 之 上位机】 之 【46.QT音频接口】
    查看>>
    一文理解设计模式--命令模式(Command)
    查看>>
    VTK:可视化之RandomProbe
    查看>>
    block多队列分析 - 2. block多队列的初始化
    查看>>
    Java时间
    查看>>
    不编译只打包system或者vendor image命令
    查看>>
    【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
    查看>>
    flink启动(二)
    查看>>
    pair的用法
    查看>>
    Flex 布局的自适应子项内容过长导致其被撑大问题
    查看>>