>  기사  >  Java  >  분산 트랜잭션: 신뢰할 수 있는 메시지 최종 일관성 체계

분산 트랜잭션: 신뢰할 수 있는 메시지 최종 일관성 체계

Java后端技术全栈
Java后端技术全栈앞으로
2023-08-24 15:27:42735검색


모든 사람은 자주 언급되는 ACID, 그러나 후속 분산 트랜잭션 콘텐츠에 대해 먼저 이야기해 보겠습니다ACID를 설명한 다음 분산 트랜잭션, 마지막으로 신뢰할 수 있는 뉴스분산 트랜잭션 솔루션. ACID,但是为了后续的分布式事务的内容,我们先来聊聊 ACID,然后再介绍下什么是分布式事务,最后着重讲下基于可靠消息的分布式事务解决方案。

什么是事务

严格意义上的事务应该是具备原子性、一致性、隔离性和持久性,简称 ACID

거래란 무엇입니까

엄격한 의미의 트랜잭션은 ACID. 🎜
  1. 원자성( 원자성)은 트랜잭션 내의 모든 작업이 실행되거나 실행되지 않는 것으로 이해될 수 있습니다.
  2. 原子性(Atomicity),可以理解为一个事务内的所有操作要么都执行,要么都不执行。
  • 一致性(Consistency),可以理解为数据是满足完整性约束的,也就是不会存在中间状态的数据,比如你钱包有100,我钱包有100,你给我打50块,此时你钱包的钱应该是50,我钱包的钱应该是150,不会存在我钱加了,你钱没扣的中间状态。
  • 隔离性(Isolation),指的是多个事务并发执行的时候不会互相干扰,即一个事务内部的数据对于其他事务来说是隔离的。
  • 持久性(Durability),指的是一个事务完成了之后数据就被永远保存下来,之后的其他操作或故障都不会对事务的结果产生影响。
  • 而通俗意义上事务就是为了使得一些更新操作要么都成功,要么都失败

    什么是分布式事务

    分布式事务顾名思义就是要在分布式系统中实现事务,它其实是由多个本地事务

    일관성은 데이터가 무결성 제약 조건을 충족한다는 의미로 이해될 수 있습니다. 즉, 중간 상태의 데이터는 없습니다. 예를 들어, 귀하의 지갑에는 100이 있고, 내 지갑에는 100이 있습니다. 나에게 50위안을 지불하세요. 이때 당신의 지갑에 있는 돈은 50원, 내 지갑에 있는 돈은 150원이어야 합니다. 내 돈이 추가되고 당신의 돈이 공제되지 않는 중간 상태는 없습니다. 🎜🎜격리는 여러 트랜잭션이 동시에 실행될 때 서로 간섭하지 않는다는 사실을 나타냅니다. 즉, 트랜잭션 내의 데이터가 다른 트랜잭션과 격리됩니다. 🎜🎜지속성(Durability)은 거래가 완료된 후 데이터가 영구적으로 저장되며 이후의 다른 작업이나 실패가 거래 결과에 영향을 미치지 않는다는 것을 의미합니다.

    대중적인 의미에서 트랜잭션은 일부 업데이트 작업을 활성화하는 것입니다둘 다 성공하거나 둘 다 실패합니다. 🎜

    분산 트랜잭션이란 무엇입니까

    분산 트랜잭션 이름에서 알 수 있듯이 분산 시스템에서 트랜잭션을 구현하는 것입니다. 실제로는 여러 개의 로컬 트랜잭션이 결합됩니다. 🎜

    대규모 작업은 여러 서버에 분산된 다양한 소규모 작업으로 구성됩니다. 분산 트랜잭션은 이러한 작은 작업이 모두 성공하거나 모두 실패하도록 보장해야 합니다. 기본적으로 분산 트랜잭션는 <code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px; background를 보장합니다. -color: rgba(27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb><code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin- 다른 데이터베이스의 경우 왼쪽: 2px ;배경색: rgba(27, 31, 35, 0.05);글꼴 계열: " operator mono consolas monaco menlo monospace break-all rgb>데이터 일관성. 分布式事务需要保证这些小操作要么全部成功,要么全部失败。从本质上来说,分布式事务就是为了保证不同数据库数据一致性

    常见的分布式事务的解决方案有以下几种:2PC,3PC,TCC,本地消息表、可靠消息最终一致性、尽最大努力通知

    今天我们就着重讲讲可靠消息最终一致性的解决方案

    什么是可靠消息最终一致性方案

    可靠消息最终一致性方案是指当事务发起方执行完成本地事务后发出消息到消息中间件事务参与方(消息消费者)一定能够接收到消息并处理事务成功,此方案强调的是只要消息发给事务参与方,则最终事务要达到一致

    일반적인 분산 트랜잭션 솔루션에는 다음이 포함됩니다.2PC, 3PC, TCC, 로컬 메시지 테이블, 신뢰할 수 있는 메시지 최종 일관성, 최선의 노력 알림 등🎜🎜오늘은 신뢰할 수 있는 메시지 최종 일관성을 위한 솔루션 🎜

    신뢰할 수 있는 메시지 최종 일관성 체계란 무엇입니까

    🎜 신뢰할 수 있는 메시지 최종 일관성 체계는 트랜잭션 개시자가 로컬 트랜잭션을 완료할 때 메시지 미들웨어, 거래 참가자(메시지 소비자)는 메시지를 수신하고 거래를 처리할 수 있어야 합니다. 성공, 이 솔루션은 메시지가 전송되는 한; 거래 참가자에게 최종 거래는 일관성을 유지해야 합니다. 🎜

    이 방법의 문제점은 무엇입니까?

    이 솔루션은 메시지 미들웨어를 통해 구현됩니다. 트랜잭션 개시자(메시지 생성자)는 메시지 미들웨어로 메시지를 보내고, 트랜잭션 참여자는 메시지 미들웨어로부터 메시지를 받습니다. 네트워크 통신의 불확실성으로 인해 배포가 발생합니다. 아래와 같이 트랜잭션 문제를 입력합니다.

    분산 트랜잭션: 신뢰할 수 있는 메시지 최종 일관성 체계

    로컬 트랜잭션 및 메시지 원자성 문제

    위 그림의 점선 상자에 표시된 것처럼 다음과 같은 상황이 있습니다. 분산 트랜잭션: 신뢰할 수 있는 메시지 최종 일관성 체계


    1 ) 로컬 트랜잭션 제출이 실패하면 메시지가 전송되지 않습니다.

    2) 로컬 트랜잭션이 성공하고 메시지 전송이 실패하며 로컬 트랜잭션이 롤백됩니다.
    3) 로컬 메시지가 성공하고 메시지 시간이 초과되며 로컬 트랜잭션이 롤백되고 결국 메시지가 실패합니다.

    4) 로컬 메시지가 성공하고, 메시지 시간이 초과되고, 로컬 트랜잭션이 롤백되고, 마침내 메시지가 성공합니다.



    요약하자면 네 번째 상황은 메시지 참가자의 트랜잭션과 일치하지 않는 로컬 트랜잭션을 초래합니다.

      거래 참여자가 받은 메시지의 신뢰성. 第四种情况,造成本地事务,与消息参与方的事务不一致。

      1. 事务参与方接收消息的可靠性。

      消息中间件与事务参与方要确保能够成功消费到消息。

      1. 消息重复消费

      注意事务参与方的接口幂等性

      🎜🎜🎜 메시지 미들웨어 거래 참가자메시지를 성공적으로 소비했습니다. 🎜
        🎜🎜메시지의 반복 소비🎜🎜🎜🎜🎜 인터페이스 멱등성 문제. 메시지 참가자가 성공적으로 소비했을 수 있습니다. 네트워크 문제로 인해 메시지 미들웨어가 메시지가 소비되지 않은 것으로 믿고 문제가 발생합니다. 재시도를 시작한 후. 🎜

        Solution

        1. 로컬 메시지 테이블

        로컬 메시지 테이블의 핵심은 메시지 로그를 저장하는 로컬 기록 테이블이 있다는 것입니다. 메시지를 지속적으로 스캔하려면 예약된 작업을 시작해야 합니다. 메시지를 보낼 수 있는지 확인하기 위한 로그 기록입니다. 구체적인 프로세스는 다음과 같습니다.

        분산 트랜잭션: 신뢰할 수 있는 메시지 최종 일관성 체계

        위 그림의 프로세스:

        1) 트랜잭션 개시자의 로컬 트랜잭션이 성공적으로 실행되고 메시지 로그가 로컬 메시지 테이블에 기록됩니다.
        2) 예약된 작업을 시작하고 주기적으로 로컬 메시지 테이블을 스캔합니다.
        3) 예약된 작업이 메시지를 스캔하면 해당 메시지를 메시지 미들웨어로 보냅니다.
        4) 메시지 미들웨어는 메시지를 수신하고 메시지를 성공적으로 반환하여 트랜잭션 개시자에게 성공 알림을 보냅니다.
        5) 트랜잭션 개시자는 메시지를 수신하고 성공적으로 보낸 후 로그 메시지를 삭제합니다.
        6) 거래 참가자는 메시지를 구독하고 메시지를 소비합니다.
        7) 거래 참가자는 지역 업무를 처리합니다.
        8) 로컬 트랜잭션이 성공적으로 처리되고 성공적인 ack가 메시지 미들웨어로 전송됩니다.

        주의할 점:
        거래 참가자는 인터페이스 멱등성을 보장합니다. 事务参与方保证接口幂等性

        1. RocketMq事务消息方案

        Apache RocketMQ 4.3之后的版本正式支持事务消息,为分布式事务实现提供了便利性支持。在RocketMQ 4.3后实现了完整的事务消息,实际上其实是对本地消息表的一个封装,将本地消息表移动到了MQ内部,解决 Producer 端的消息发送与本地事务执行的原子性

          RocketMq 트랜잭션 메시지 솔루션분산 트랜잭션: 신뢰할 수 있는 메시지 최종 일관성 체계

          🎜🎜🎜Apache RocketMQ 4.3 이후 버전은 트랜잭션 메시지는 분산 트랜잭션 구현을 위한 편리한 지원을 제공합니다. 전체 트랜잭션 메시지는 RocketMQ 4.3 이후에 구현되며 실제로 로컬 메시지 테이블의 캡슐화, 로컬 메시지 테이블을 MQ 내부, 생산자 측에서 메시지 전송 및 로컬 트랜잭션 실행 문제 해결원자성 문제. 🎜🎜🎜🎜

          구현 프로세스:

          1) 트랜잭션 개시자는 거래 메시지 Half事务消息
          2)RocketMq回复Half发送成功
          3)事务发起方执行本地事务
          4)事务发起方执行本地事务成功,发送commit到RocketMq,mq投递消息到事务参与方;事务发起方执行本地事务失败,发送rollback到RocketMq,mq删除消息。
          5)当RocketMq一定时间内未收到来自事务发起方的确认信息,会对事务发起方进行事务回查
          6)事务发起方查询本地事务状态。
          7)事务发起方根据查询到的事务状态发送commint/rollback到RocketMq。
          8)当RocketMq发起commit后,收到失败或一定时间未收到成功ack,则会发起重试。

          优点

          消息数据独立存储,降低业务系统与消息系统之间的耦合。
          吞吐量优于本地消息表方案。

          缺点2) RocketMq 응답Half가 성공적으로 전송되었습니다

          3) 트랜잭션 개시자가 로컬 트랜잭션을 실행합니다

          4) 트랜잭션 개시자가 로컬 트랜잭션을 성공적으로 실행하고 RocketMq에 커밋을 보냅니다. , mq 전달 메시지는 트랜잭션 참가자에게 전송됩니다. 트랜잭션 개시자는 로컬 트랜잭션 실행에 실패하고 RocketMq로 롤백하면 mq는 메시지를 삭제합니다.
          5) RocketMq는 일정 시간 내에 거래 개시자로부터 확인 정보를 받지 못한 경우 거래 검토.

          6) 거래 개시자는 로컬 거래 상태를 쿼리합니다.

          7) 트랜잭션 개시자는 쿼리된 트랜잭션 상태에 따라 RocketMq에 커밋/롤백합니다.

          8) RocketMq가 commit 이후, 실패가 수신되거나 일정 시간 동안 성공적인 ack가 수신되지 않으면 재시도가 시작됩니다.
      장점: 🎜🎜메시지 데이터가 독립적으로 저장되므로 비즈니스 시스템과 메시지 시스템 간의 결합이 줄어듭니다. 🎜로컬 메시지 테이블 솔루션보다 처리량이 더 좋습니다. 🎜🎜단점 code>: 🎜🎜1개의 메시지를 전송하려면 2개의 네트워크 요청(하프 메시지 + 커밋/롤백)이 필요합니다. 🎜메시지 검토 인터페이스를 구현해야 합니다. 🎜🎜사실 각 분산 거래 솔루션에는 장단점이 있습니다. 장단점을 따져보고 비즈니스 시나리오에 가장 적합한 솔루션을 선택해야 합니다. 🎜🎜🎜

      위 내용은 분산 트랜잭션: 신뢰할 수 있는 메시지 최종 일관성 체계의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

      성명:
      이 기사는 Java后端技术全栈에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제