Maison  >  Questions et réponses  >  le corps du texte

java - 分布式环境下,定时任务或异步处理如何保持幂等性?

天蓬老师天蓬老师2763 Il y a quelques jours784

répondre à tous(9)je répondrai

  • 黄舟

    黄舟2017-04-18 09:28:19

    L'impuissance signifie généralement que la méthode ne change pas le statut de l'entreprise, elle peut donc garantir que l'effet des appels répétés est le même que l'effet d'un seul appel.

    En regardant votre description, vos tâches planifiées et traitements asynchrones sont susceptibles de modifier le statut de l'entreprise (comme l'insertion de données). Il est probable que votre méthode elle-même ne soit pas une méthode. puissance Attendez. Si tel est le cas, il n'y a fondamentalement aucune solution.

    Je pense que l'idée derrière votre question pourrait être : dans un environnement distribué, comment garantir que lors de l'envoi de demandes répétées pour des tâches planifiées et un traitement asynchrone, la logique métier réelle est exécutée uniquement une fois ?

    Si tel est le cas, vous pouvez utiliser un stockage centralisé (tel que redis) pour enregistrer l'enregistrement de la demande de l'appelant. Après avoir reçu la demande, le serveur utilise des opérations de requête atomique et de sauvegarde (telles que la commande

    setnx de redis). , pour garantir qu'une seule demande sera enregistrée avec succès. Cela peut avoir pour effet de n'exécuter l'activité réelle qu'une seule fois.

    boolean setSuccess = redis.setnx(request.serializeToString(),"");//原子操作
    if(setSuccess){
      doBusiness(); //执行业务
    }else{
      doNothing(); //什么都不做
    }

    répondre
    0
  • PHPz

    PHPz2017-04-18 09:28:19

    Je n'ai aucune expérience dans ce domaine, mais l'approche de l'entreprise consiste à utiliser l'IP pour porter des jugements, et seule l'IP désignée peut exécuter cette tâche planifiée.

    Ce qui suit est un fantasme personnel sans expérience pratique :
    Créez une application publique spécifiquement pour gérer les tâches planifiées, puis fournissez une interface de message pour que des applications spécifiques puissent l'appeler.

    répondre
    0
  • 迷茫

    迷茫2017-04-18 09:28:19

    Utilisez des transactions pour l'implémenter, des transactions distribuées ou des files d'attente de messages

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-18 09:28:19

    1. Rendre l'opération elle-même idempotente, comme changer l'opération +1 en = opération

    2. Donnez à chaque opération un identifiant et enregistrez chaque exécution Avant l'exécution, vérifiez si l'opération avec cet identifiant a été exécutée auparavant

    répondre
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:28:19

    Vous pouvez envisager une file d'attente de messages avec un mécanisme d'accusé de réception, tel que RabbitMQ, etc., qui garantit non seulement qu'une tâche n'est assignée qu'à un seul travailleur, mais garantit également l'intégrité du succès de la tâche

    répondre
    0
  • 黄舟

    黄舟2017-04-18 09:28:19

    Nous y parvenons grâce à la planification zk. Dans un environnement distribué, une tâche ne peut être exécutée que par une seule machine au maximum. ZK peut très bien réaliser cette fonction

    .

    répondre
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:28:19

    Toutes les réponses jusqu'à présent sont fausses, y compris celle acceptée. La raison en est que les tâches planifiées ou les traitements asynchrones n’ont rien à voir avec l’idempotence.

    répondre
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:28:19

    redis + jeton suffit

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-18 09:28:19

    Utilisez une file d'attente. Une fois que vous l'aurez prise, elle ne sera exécutée qu'une seule fois. Si l'exécution échoue, elle sera renvoyée dans la file d'attente et attendra la prochaine fois

    .

    répondre
    0
  • Annulerrépondre