Maison  >  Article  >  Java  >  Transactions distribuées : système de cohérence éventuelle des messages fiables

Transactions distribuées : système de cohérence éventuelle des messages fiables

Java后端技术全栈
Java后端技术全栈avant
2023-08-24 15:27:42679parcourir


Tout le monde doit être familier avec les affaires, telles que le ACID, mais pour les Contenu des transactions distribuées, parlons-en d'abordACID, puis introduisez ce qu'est Transactions distribuées, et enfin concentrez-vous sur Actualités fiablesSolution de transaction distribuée. ACID,但是为了后续的分布式事务的内容,我们先来聊聊 ACID,然后再介绍下什么是分布式事务,最后着重讲下基于可靠消息的分布式事务解决方案。

什么是事务

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

Qu'est-ce qu'une transaction

Les transactions au sens strict doivent avoir une atomicité, une cohérence, une isolation et une durabilité, appelées ACID. 🎜
  1. Atomicité ( Atomicité), qui peut être compris comme toutes les opérations au sein d'une transaction sont soit exécutées, soit non exécutées.
  2. 原子性(Atomicity),可以理解为一个事务内的所有操作要么都执行,要么都不执行。
  • 一致性(Consistency),可以理解为数据是满足完整性约束的,也就是不会存在中间状态的数据,比如你钱包有100,我钱包有100,你给我打50块,此时你钱包的钱应该是50,我钱包的钱应该是150,不会存在我钱加了,你钱没扣的中间状态。
  • 隔离性(Isolation),指的是多个事务并发执行的时候不会互相干扰,即一个事务内部的数据对于其他事务来说是隔离的。
  • 持久性(Durability),指的是一个事务完成了之后数据就被永远保存下来,之后的其他操作或故障都不会对事务的结果产生影响。
  • 而通俗意义上事务就是为了使得一些更新操作要么都成功,要么都失败

    什么是分布式事务

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

    La cohérence peut être comprise comme si les données satisfont aux contraintes d'intégrité, c'est-à-dire qu'il n'y aura aucune donnée dans un état intermédiaire. Par exemple, votre portefeuille en a 100, mon portefeuille en a 100, vous le donnez à moi Payez 50 yuans. À ce moment-là, l'argent dans votre portefeuille devrait être de 50 et l'argent dans mon portefeuille devrait être de 150. Il n'y aura pas d'état intermédiaire où mon argent sera ajouté et votre argent ne sera pas déduit. 🎜🎜Isolement fait référence au fait que plusieurs transactions n'interféreront pas les unes avec les autres lorsqu'elles sont exécutées simultanément, c'est-à-dire que les données d'une transaction sont isolées des autres transactions. 🎜🎜Durabilité (Durabilité) signifie qu'une fois la transaction terminée, les données sont enregistrées pour toujours et que les autres opérations ou échecs ultérieurs n'affecteront pas le résultat de la transaction.

    Dans un sens courant, les transactions doivent permettre certaines opérations de mise à jourSoit les deux réussissent, soit les deux échouent. 🎜

    Qu'est-ce qu'une transaction distribuée

    Transaction distribuée Comme son nom l'indique, il s'agit d'implémenter des transactions dans un système distribué. Il est en fait composé de plusieurs Les transactions locales sont combinées. 🎜

    Une grande opération est composée de différentes petites opérations, qui sont réparties sur différents serveurs Les transactions distribuées doivent garantir que ces petites opérations réussissent toutes ou échouent toutes. Essentiellement, Transactions distribuées doivent garantir que <code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background -couleur : rgba(27, 31, 35, 0,05) ; famille de polices : « Operator Mono », Consolas, Monaco, Menlo, monospace ; saut de mot : break-all ; couleur : rgb (40, 202, 113) ; "><code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin- for different bases de données left: 2px ;couleur d'arrière-plan : rgba(27, 31, 35, 0,05) ;famille de polices : « Operator Mono », Consolas, Monaco, Menlo, monospace ;saut de mot : break-all ;couleur : rgb(40, 202, 113 );">Cohérence des données. 分布式事务需要保证这些小操作要么全部成功,要么全部失败。从本质上来说,分布式事务就是为了保证不同数据库数据一致性

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

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

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

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

    Les solutions de transactions distribuées courantes sont les suivantes :2PC, 3PC, TCC, table de messages locaux, cohérence finale fiable des messages, notification de meilleur effort, etc.🎜🎜Aujourd'hui, nous allons nous concentrer sur Solution pour une cohérence éventuelle des messages fiables 🎜

    Quel est le schéma de cohérence éventuel du message fiable

    🎜 Un système de cohérence éventuelle des messages fiable signifie que lorsque l'initiateur de la transaction termine la transaction locale, il envoie un message à Middleware de messages, Les participants à la transaction (consommateurs du message) doivent pouvoir recevoir le message et traiter la transaction. Succès, cette solution souligne  Tant que le message est envoyé) pour les participants à la transaction, la transaction finale doit être cohérente. 🎜

    Quels sont les problèmes avec cette méthode ?

    Cette solution est implémentée via un middleware de message. L'initiateur de la transaction (producteur de message) envoie le message au middleware de message, et les participants à la transaction reçoivent le message du middleware de message. En raison de l'incertitude de la communication réseau, la distribution aura lieu. Tapez le problème de transaction, comme indiqué ci-dessous :

    Transactions distribuées : système de cohérence éventuelle des messages fiables

    1. Problème d'atomicité des transactions locales et des messages

    Transactions distribuées : système de cohérence éventuelle des messages fiables

    Comme le montre l'image ci-dessus dans l'encadré en pointillés, il existe les situations suivantes :

    1 ) Transaction locale Si la soumission échoue, le message n'est pas envoyé.
    2) La transaction locale réussit, l'envoi du message échoue et la transaction locale est annulée.
    3) Le message local réussit, le message expire, la transaction locale est annulée et le message échoue finalement.
    4) Le message local réussit, le message expire, la transaction locale est annulée et le message réussit enfin.

    Pour résumer, il y a La quatrième situation entraîne des transactions locales qui sont incohérentes avec les transactions des participants au message. 第四种情况,造成本地事务,与消息参与方的事务不一致。

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

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

    1. 消息重复消费

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

      🎜La fiabilité des messages reçus par les participants à la transaction. 🎜🎜🎜🎜🎜Middleware de message avec Les participants à la transaction doivent s'assurer que Consommation réussie du message. 🎜
        🎜🎜Consommation répétée de messages🎜🎜🎜🎜🎜Faites attention au Problème d'idempotence de l'interface. Le participant au message l'a peut-être consommé avec succès. En raison de problèmes de réseau, le middleware de message estime que le message n'a pas été consommé et le problème se produit après avoir lancé une nouvelle tentative. 🎜

        Solution

        1. Table des messages locaux

        La clé de la table des messages locaux est qu'il existe une table d'enregistrement locale qui stocke les journaux de messages. Vous devez démarrer une tâche planifiée pour analyser le message en continu. enregistrer les enregistrements pour garantir que les messages peuvent être envoyés. Le processus spécifique est le suivant :

        Transactions distribuées : système de cohérence éventuelle des messages fiables

        Le processus dans l'image ci-dessus :

        1) La transaction locale de l'initiateur de la transaction est exécutée avec succès et le journal des messages est enregistré dans la table des messages locaux.
        2) Démarrez une tâche planifiée et analysez cycliquement la table des messages locaux.
        3) Lorsqu'une tâche planifiée analyse un message, elle envoie le message au middleware de messages.
        4) Le middleware de message reçoit le message et renvoie le message avec succès pour envoyer une notification réussie à l'initiateur de la transaction.
        5) L'initiateur de la transaction supprime le message du journal après avoir reçu le message et l'avoir envoyé avec succès.
        6) Les participants à la transaction s'abonnent aux messages et consomment des messages.
        7) Les participants à la transaction s'occupent des affaires locales.
        8) La transaction locale est traitée avec succès et un accusé de réception réussi est envoyé au middleware de message.

        Points à noter :
        Les participants à la transaction garantissent l'idempotence de l'interface. 事务参与方保证接口幂等性

        1. RocketMq事务消息方案

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

          Solution de message de transaction RocketMqTransactions distribuées : système de cohérence éventuelle des messages fiables

          🎜🎜🎜Apache RocketMQ Les versions ultérieures à 4.3 prennent officiellement en charge Message de transaction fournit une prise en charge pratique pour la mise en œuvre de transactions distribuées. Le message de transaction complet est implémenté après RocketMQ 4.3, qui est en fait Une encapsulation de la table des messages locaux, déplaçant la table des messages locaux vers MQ interne, résolvant le problème de l'envoi de messages et de l'exécution de transactions locales côté producteurAtomicité. 🎜🎜🎜🎜

          Processus de mise en œuvre :

          1) L'initiateur de la transaction envoie DemiMessage de transactionHalf事务消息
          2)RocketMq回复Half发送成功
          3)事务发起方执行本地事务
          4)事务发起方执行本地事务成功,发送commit到RocketMq,mq投递消息到事务参与方;事务发起方执行本地事务失败,发送rollback到RocketMq,mq删除消息。
          5)当RocketMq一定时间内未收到来自事务发起方的确认信息,会对事务发起方进行事务回查
          6)事务发起方查询本地事务状态。
          7)事务发起方根据查询到的事务状态发送commint/rollback到RocketMq。
          8)当RocketMq发起commit后,收到失败或一定时间未收到成功ack,则会发起重试。

          优点

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

          缺点2) Réponse RocketMqLa moitié est envoyée avec succès

          3) L'initiateur de la transaction exécute la transaction locale

          4) L'initiateur de la transaction exécute la transaction locale avec succès et envoie la validation à RocketMq , mq delivery Le message est envoyé aux participants à la transaction ; l'initiateur de la transaction ne parvient pas à exécuter la transaction locale et envoie rollback vers RocketMq, mq supprime le message.
          5) Lorsque RocketMq ne reçoit pas d'informations de confirmation de l'initiateur de la transaction dans un certain délai, il effectuera Examen des transactions.

          6) L'initiateur de la transaction interroge l'état de la transaction locale.

          7) L'initiateur de la transaction envoie commint/rollback vers RocketMq.

          8) Lorsque RocketMq lance commit, si un échec est reçu ou si un accusé de réception réussi n'est pas reçu pendant un certain temps, une nouvelle tentative sera lancée.
    Avantages : 🎜🎜Les données des messages sont stockées indépendamment, réduisant ainsi le couplage entre le système métier et le système de messagerie. 🎜Le débit est meilleur que la solution de table de messages locale. 🎜🎜Inconvénients code> : 🎜🎜L'envoi d'un message nécessite deux requêtes réseau (demi-message + commit/rollback). 🎜Besoin d'implémenter l'interface de révision des messages. 🎜🎜En fait, chaque solution de transaction distribuée présente des avantages et des inconvénients. Nous devons peser le pour et le contre et choisir celle qui convient le mieux au scénario commercial. 🎜🎜🎜

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer