Heim  >  Artikel  >  Java  >  Verteilte Transaktionen: Zuverlässiges Nachrichtenkonsistenzschema

Verteilte Transaktionen: Zuverlässiges Nachrichtenkonsistenzschema

Java后端技术全栈
Java后端技术全栈nach vorne
2023-08-24 15:27:42722Durchsuche


Jeder muss mit Angelegenheiten vertraut sein, wie zum Beispiel dem oft erwähnten ACID, aber für nachfolgende Verteilte Transaktion Inhalt, lass uns zuerst darüber redenACID, und dann vorstellen, was ist Verteilte Transaktionen und schließlich den Fokus auf 分布式事务的内容,我们先来聊聊 ACID,然后再介绍下什么是分布式事务,最后着重讲下基于可靠消息的分布式事务解决方案。

什么是事务

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

Was ist eine Transaktion

Transaktionen im engeren Sinne sollten Atomizität, Konsistenz, Isolation und Haltbarkeit aufweisen, die als ACID. 🎜
  1. 原子性(Atomicity),可以理解为一个事务内的所有操作要么都执行,要么都不执行。
  2. 一致性(Consistency),可以理解为数据是满足完整性约束的,也就是不会存在中间状态的数据,比如你钱包有100,我钱包有100,你给我打50块,此时你钱包的钱应该是50,我钱包的钱应该是150,不会存在我钱加了,你钱没扣的中间状态。
  3. 隔离性(Isolation),指的是多个事务并发执行的时候不会互相干扰,即一个事务内部的数据对于其他事务来说是隔离的。
  4. 持久性(Durability),指的是一个事务完成了之后数据就被永远保存下来,之后的其他操作或故障都不会对事务的结果产生影响。

而通俗意义上事务就是为了使得一些更新操作要么都成功,要么都失败

什么是分布式事务

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

Konsistenz kann so verstanden werden, dass die Daten Integritätsbeschränkungen erfüllen, das heißt, es befinden sich keine Daten in einem Zwischenzustand. Zum Beispiel hat Ihre Brieftasche 100, meine Brieftasche hat 100, Sie geben sie weiter Ich bezahle 50 Yuan. Zu diesem Zeitpunkt sollte das Geld in Ihrer Brieftasche 50 betragen und das Geld in meiner Brieftasche sollte 150 betragen. Es wird keinen Zwischenzustand geben, in dem mein Geld hinzugefügt und Ihr Geld nicht abgezogen wird.
🎜🎜Isolation bezieht sich auf die Tatsache, dass sich mehrere Transaktionen bei gleichzeitiger Ausführung nicht gegenseitig stören, d. h. die Daten innerhalb einer Transaktion sind von anderen Transaktionen isoliert. 🎜🎜Dauerhaftigkeit (Durability) bedeutet, dass die Daten nach Abschluss einer Transaktion für immer gespeichert werden und andere nachfolgende Vorgänge oder Fehler keinen Einfluss auf das Ergebnis der Transaktion haben.

Im Volksmund sollen Transaktionen einige Aktualisierungsvorgänge ermöglichenEntweder beide erfolgreich oder beide fehlschlagen. 🎜

Was ist eine verteilte Transaktion

Lokale Transaktionen werden kombiniert. 🎜

Eine große Operation besteht aus verschiedenen kleinen Operationen, die auf verschiedene Server verteilt sind. Verteilte Transaktionen müssen sicherstellen, dass diese kleinen Vorgänge entweder alle erfolgreich sind oder alle fehlschlagen. Im Wesentlichen gilt: Datenkonsistenz. 分布式事务需要保证这些小操作要么全部成功,要么全部失败。从本质上来说,分布式事务就是为了保证不同数据库数据一致性

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

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

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

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

Zu den gängigen Lösungen für verteilte Transaktionen gehören:2PC, 3PC, TCC, lokale Nachrichtentabelle, zuverlässige Nachrichtenkonsistenz, Best-Effort-Benachrichtigung usw.🎜🎜Heute konzentrieren wir uns auf Lösung für zuverlässige Nachrichtenkonsistenz 🎜

Was ist das zuverlässige Eventual-Consistency-Schema für Nachrichten

🎜Nachrichten-Middleware, Transaktionsteilnehmer (Nachrichtenkonsumenten) müssen in der Lage sein, die Nachricht zu empfangen und die Transaktion zu verarbeiten. Erfolgreich, diese Lösung betont Was sind die Probleme bei dieser Methode?

Diese Lösung wird durch Nachrichten-Middleware implementiert. Der Transaktionsinitiator (Nachrichtenproduzent) sendet die Nachricht an die Nachrichten-Middleware, und die Transaktionsteilnehmer empfangen die Nachricht von der Nachrichten-Middleware Typ-Transaktionsproblem, wie unten gezeigt:

Verteilte Transaktionen: Zuverlässiges Nachrichtenkonsistenzschema

  1. Lokales Transaktions- und Nachrichtenatomaritätsproblem

Verteilte Transaktionen: Zuverlässiges Nachrichtenkonsistenzschema

Wie im obigen Bild im gepunkteten Feld gezeigt, gibt es die folgenden Situationen:

1 ) Lokale Transaktion Wenn die Übermittlung fehlschlägt, wird die Nachricht nicht gesendet.
2) Die lokale Transaktion ist erfolgreich, das Senden der Nachricht schlägt fehl und die lokale Transaktion wird zurückgesetzt.
3) Die lokale Nachricht ist erfolgreich, die Nachricht läuft ab, die lokale Transaktion wird zurückgesetzt und die Nachricht schlägt letztendlich fehl.
4) Die lokale Nachricht ist erfolgreich, die Nachricht läuft ab, die lokale Transaktion wird zurückgesetzt und die Nachricht ist schließlich erfolgreich.

Zusammenfassend gibt es Die vierte Situation führt zu lokalen Transaktionen, die nicht mit den Transaktionen der Nachrichtenteilnehmer übereinstimmen. 第四种情况,造成本地事务,与消息参与方的事务不一致。

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

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

  1. 消息重复消费

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

    🎜Die Zuverlässigkeit der von Transaktionsteilnehmern empfangenen Nachrichten. 🎜🎜🎜🎜🎜Nachrichten-Middleware mit Transaktionsteilnehmer müssen sicherstellen, dass Die Nachricht wurde erfolgreich verarbeitet. 🎜
      🎜🎜Wiederholter Nachrichtenverbrauch🎜🎜🎜🎜🎜Achten Sie auf den Schnittstellen-Idempotenz Problem. Der Nachrichtenteilnehmer hat sie möglicherweise erfolgreich konsumiert. Aufgrund von Netzwerkproblemen geht die Nachrichten-Middleware davon aus, dass die Nachricht nicht konsumiert wurde, und das Problem tritt danach auf einen erneuten Versuch einleiten. 🎜

      Lösung

      1. Lokale Nachrichtentabelle

      Der Schlüssel zur lokalen Nachrichtentabelle besteht darin, dass es eine lokale Datensatztabelle gibt, in der Nachrichtenprotokolle gespeichert werden. Sie müssen eine geplante Aufgabe starten, um die Nachricht kontinuierlich zu scannen Protokolldatensätze, um sicherzustellen, dass Nachrichten gesendet werden können. Der spezifische Prozess ist wie folgt:

      Verteilte Transaktionen: Zuverlässiges Nachrichtenkonsistenzschema

      Der Prozess im obigen Bild:

      1) Die lokale Transaktion des Transaktionsinitiators wird erfolgreich ausgeführt und das Nachrichtenprotokoll wird in der lokalen Nachrichtentabelle aufgezeichnet.
      2) Starten Sie eine geplante Aufgabe und scannen Sie die lokale Nachrichtentabelle zyklisch.
      3) Wenn eine geplante Aufgabe eine Nachricht scannt, sendet sie die Nachricht an die Nachrichten-Middleware.
      4) Die Nachrichten-Middleware empfängt die Nachricht und sendet die Nachricht erfolgreich zurück, um eine erfolgreiche Benachrichtigung an den Transaktionsinitiator zu senden.
      5) Der Transaktionsinitiator löscht die Protokollnachricht, nachdem er die Nachricht empfangen und erfolgreich gesendet hat.
      6) Transaktionsteilnehmer abonnieren Nachrichten und konsumieren Nachrichten.
      7) Die Transaktionsteilnehmer kümmern sich um lokale Angelegenheiten.
      8) Die lokale Transaktion wird erfolgreich verarbeitet und eine erfolgreiche Bestätigung wird an die Nachrichten-Middleware gesendet.

      Zu beachtende Punkte:
      Transaktionsteilnehmer garantieren Schnittstellen-Idempotenz. 事务参与方保证接口幂等性

      1. RocketMq事务消息方案

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

        RocketMq-TransaktionsnachrichtenlösungVerteilte Transaktionen: Zuverlässiges Nachrichtenkonsistenzschema

        🎜🎜🎜Apache RocketMQ Versionen nach 4.3 unterstützen offiziell Transaction message bietet praktische Unterstützung für die Implementierung verteilter Transaktionen. Die vollständige Transaktionsnachricht wird nach RocketMQ 4.3 implementiert und ist tatsächlich Eine Kapselung der lokalen Nachrichtentabelle, die die lokale Nachrichtentabelle nach MQ internal, löst das Problem des Nachrichtenversands und der lokalen Transaktionsausführung auf der ProduzentenseiteImplementierungsprozess: <br><blockquote data-tool="mdnice编辑器" style="border-top: none;border-right: none;border-bottom: none;font-size: 0.9em;overflow: auto;background: rgb(251, 249, 253);color: rgb(106, 115, 125);margin-bottom: 20px;margin-top: 20px;padding: 15px 20px;line-height: 27px;border-left-color: rgb(53, 179, 120);"><p style="line-height: 26px;font-size: 15px;color: rgb(89, 89, 89);">1) Der Transaktionsinitiator sendet <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;word-break: break-all;color: rgb( 40, 202, 113);">HalfTransaktionsnachricht 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-AntwortHalf wurde erfolgreich gesendet

        3) Der Transaktionsinitiator führt die lokale Transaktion aus

        4) Der Transaktionsinitiator führt die lokale Transaktion erfolgreich aus und sendet Commit an RocketMq , mq-Zustellung Die Nachricht wird an die Transaktionsteilnehmer gesendet. Der Transaktionsinitiator kann die lokale Transaktion nicht ausführen und sendet rollback zu RocketMq, mq löscht die Nachricht.
        5) Wenn RocketMq innerhalb eines bestimmten Zeitraums keine Bestätigungsinformationen vom Transaktionsinitiator erhält, führt es Folgendes aus: Transaktionsüberprüfung.

        6) Der Transaktionsinitiator fragt den lokalen Transaktionsstatus ab.

        7) Der Transaktionsinitiator sendet commint/rollback zu RocketMq.

        8) Wenn RocketMq Vorteile: 🎜🎜Nachrichtendaten werden unabhängig gespeichert, wodurch die Kopplung zwischen dem Geschäftssystem und dem Nachrichtensystem verringert wird. 🎜Der Durchsatz ist besser als bei der lokalen Nachrichtentabellenlösung. 🎜🎜分布式 中间件 封装 循环 接口 并发 数据库 rocketmq apache
Stellungnahme:
Dieser Artikel ist reproduziert unter:Java后端技术全栈. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen