Question Qu'est-ce qu'une opération idempotente?


Qu'est-ce qu'une opération idempotente?


654
2017-07-03 01:06


origine


Réponses:


En informatique, une opération idempotente est une opération qui n'a pas d'effet supplémentaire si elle est appelée plusieurs fois avec les mêmes paramètres d'entrée. Par exemple, supprimer un élément d'un ensemble peut être considéré comme une opération idempotente sur l'ensemble.

En mathématiques, une opération idempotente est celle où f (f (x)) = f (x). Par exemple, le abs() la fonction est idempotente parce que abs(abs(x)) = abs(x) pour tous x.

Ces définitions légèrement différentes peuvent être rapprochées en considérant que X dans la définition mathématique représente l'état d'un objet, et F est une opération qui peut muter cet objet. Par exemple, considérons Python set et son discard méthode. le discard La méthode supprime un élément d'un ensemble et ne fait rien si l'élément n'existe pas. Alors:

my_set.discard(x)

a exactement le même effet que de faire deux fois la même opération:

my_set.discard(x)
my_set.discard(x)

Les opérations idempotentes sont souvent utilisées dans la conception de protocoles réseau, où une demande d'exécution d'une opération est garantie au moins une fois, mais peut également se produire plus d'une fois. Si l'opération est idempotente, il n'y a pas de mal à effectuer l'opération deux fois ou plus.

Voir l'article Wikipedia sur idempotence pour plus d'informations.


La réponse ci-dessus avait précédemment quelques exemples incorrects et trompeurs. Les commentaires ci-dessous écrits avant avril 2014 font référence à une révision plus ancienne.


705
2017-07-03 01:10



Une opération idempotente peut être répétée un nombre arbitraire de fois et le résultat sera le même que si elle avait été faite une seule fois. En arithmétique, ajouter zéro à un nombre est idempotent.

L'idempotence est beaucoup parlée dans le contexte des services web "RESTful". REST cherche à exploiter au maximum le protocole HTTP pour permettre aux programmes d'accéder au contenu Web, contrairement aux services Web basés sur SOAP, qui ne font qu'intégrer les services de style d'appel de procédure distante dans les requêtes et les réponses HTTP.

REST organise une application Web en "ressources" (comme un utilisateur de Twitter ou une image Flickr), puis utilise les verbes HTTP de POST, PUT, GET et DELETE pour créer, mettre à jour, lire et supprimer ces ressources.

L'idempotence joue un rôle important dans REST. Si vous obtenez une représentation d'une ressource REST (par exemple, GET une image jpeg à partir de Flickr), et l'opération échoue, vous pouvez simplement répéter le GET encore et encore jusqu'à ce que l'opération réussisse. Pour le service Web, peu importe le nombre de fois que l'image est obtenue. De même, si vous utilisez un service Web RESTful pour mettre à jour vos informations de compte Twitter, vous pouvez METTRE les nouvelles informations autant de fois que nécessaire pour obtenir la confirmation du service Web. Le mettre mille fois est le même que de le mettre une fois. De même, SUPPRIMER une ressource REST mille fois revient à la supprimer une fois. L'idempotence facilite donc beaucoup la construction d'un service Web qui résiste aux erreurs de communication.

En lire plus: Services Web RESTful, par Richardson et Ruby (l'idempotence est discutée à la page 103-104), et Roy Fielding Thèse de doctorat sur REST. Fielding était l'un des auteurs de HTTP 1.1, RFC-2616, qui parle de l'idempotence dans section 9.1.2.


105
2017-07-03 01:47



Peu importe le nombre de fois que vous appelez l'opération, le résultat sera le même.


77
2017-07-03 01:10



Idempotence signifie qu'appliquer une opération une seule fois ou l'appliquer plusieurs fois a le même effet.

Exemples:

  • Multiplication par zéro. Peu importe combien de fois vous le faites, le résultat est toujours zéro.
  • Définition d'un indicateur booléen Peu importe combien de fois vous le faites, le drapeau reste fixé.
  • Suppression d'une ligne d'une base de données avec un ID donné. Si vous l'essayez à nouveau, la ligne est toujours partie.

Pour fonctions pures (fonctions sans effets secondaires) alors idempotence implique que f (x) = f (f (x)) = f (f (f (x))) = f (f (f (x)))) =. ..... pour toutes les valeurs de x

Pour fonctions avec effets secondairesL'idempotence implique en outre qu'aucun effet secondaire supplémentaire ne sera causé après la première application. Vous pouvez considérer l'état du monde comme un paramètre "caché" supplémentaire à la fonction si vous le souhaitez.

Notez que dans un monde où vous avez des actions simultanées, vous pouvez trouver que les opérations que vous pensiez idempotentes cessent de l'être (par exemple, un autre thread pourrait annuler la valeur du drapeau booléen dans l'exemple ci-dessus). Fondamentalement, chaque fois que vous avez la concurrence et l'état mutable, vous devez penser beaucoup plus attentivement à l'idempotence.

L'idempotence est souvent une propriété utile dans la construction de systèmes robustes. Par exemple, s'il existe un risque que vous receviez un message en double provenant d'un tiers, il est utile que le gestionnaire de messages agisse comme une opération idempotente, de sorte que l'effet du message ne se produise qu'une seule fois.


40
2018-03-05 04:49



Une opération idempotente produit le résultat dans le même état même si vous l'appelez plus d'une fois, à condition de transmettre les mêmes paramètres.


21
2017-07-03 01:13



Je voulais juste jeter un cas d'utilisation réel qui démontre l'idempotence. En JavaScript, disons que vous définissez un tas de classes de modèles (comme dans le modèle MVC). La façon dont cela est souvent implémenté est fonctionnellement équivalente à quelque chose comme ceci (exemple de base):

function model(name) {
  function Model() {
    this.name = name;
  }

  return Model;
}

Vous pourriez alors définir de nouvelles classes comme ceci:

var User = model('user');
var Article = model('article');

Mais si vous deviez essayer d'obtenir le User classe via model('user'), d'ailleurs dans le code, il échouerait:

var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');

Ces deux là User les constructeurs seraient différents. C'est,

model('user') !== model('user');

Pour le faire idempotent, vous ajouteriez simplement une sorte de mécanisme de mise en cache, comme ceci:

var collection = {};

function model(name) {
  if (collection[name])
    return collection[name];

  function Model() {
    this.name = name;
  }

  collection[name] = Model;
  return Model;
}

En ajoutant la mise en cache, chaque fois que vous avez fait model('user') ce sera le même objet, et donc c'est idempotent. Alors:

model('user') === model('user');

10
2017-10-09 01:30



Opérations idempotentes Les opérations qui n'ont pas d'effets secondaires si elles sont exécutées plusieurs fois.
Exemple: Une opération qui récupère des valeurs d'une ressource de données et dit, l'imprime

Opérations non idempotentes Opérations qui causeraient des dommages si elles étaient exécutées plusieurs fois. (Comme ils changent des valeurs ou des états)
Exemple: Une opération qui se retire d'un compte bancaire


8
2017-12-06 14:42



Une opération idempotente sur un ensemble laisse ses membres inchangés lorsqu'il est appliqué une ou plusieurs fois.

Cela peut être une opération unaire comme absolu (x) où x appartient à un ensemble d'entiers positifs. Ici absolu (absolu (x)) = x.

Cela peut être une opération binaire union d'un ensemble avec lui-même retournerait toujours le même ensemble.

à votre santé


6
2017-07-03 01:26



Une opération idempotente est une opération, une action ou une requête qui peut être appliquée plusieurs fois sans modifier le résultat, c'est-à-dire l'état du système, au-delà de l'application initiale.

EXEMPLES (CONTEXTE DE L'APP WEB):

NULLIPOTENT: Si une opération n'a pas d'effets secondaires, comme afficher purement et simplement des informations sur une page web sans aucune modification dans une base de données (en d'autres termes, vous lisez seulement la base de données), nous disons que l'opération est NULLIPOTENT. Tous les GET devraient être nullipotent. Sinon, utilisez POST.

IDEMPOTENT: Un message dans un système de messagerie électronique est ouvert et marqué comme "ouvert" dans la base de données. On peut ouvrir le message plusieurs fois, mais cette action répétée ne fera que produire un message «ouvert». C'est une opération idempotente.

NON-IDEMPOTENT: Si une opération provoque toujours un changement d'état, comme POST le même message à un utilisateur encore et encore, résultant en un nouveau message envoyé et stocké dans la base de données chaque fois, nous disons que l'opération est NON-IDEMPOTENT.

Lorsque nous parlons de l'état du système, nous ignorons de toute évidence des effets inoffensifs et inévitables, comme l'exploitation forestière et les diagnostics.


6
2017-08-03 22:46



Tout à fait une réponses détaillées et techniques. Juste en ajoutant une définition simple.

Idempotent = Re-runnable

Par exemple, Create opération en elle-même n'est pas garantie de fonctionner sans erreur si elle est exécutée plus d'une fois. Mais s'il y a une opération CreateOrUpdate alors il indique re-runnability (Idempotency).


6
2017-08-13 10:59