Maison  >  Article  >  développement back-end  >  Comment traiter les événements exactement une fois

Comment traiter les événements exactement une fois

Patricia Arquette
Patricia Arquetteoriginal
2024-10-07 06:08:30892parcourir

How To Process Events Exactly-Once

Vous souhaitez traiter les événements entrants exactement une fois ?

Eh bien, tout pédant des systèmes distribués dira que vous ne pouvez pas, car c'est théoriquement impossible. Et techniquement, ils ont raison : si vous envoyez un message et n'obtenez pas de réponse, vous n'avez aucun moyen de savoir si le destinataire est hors ligne ou s'il est simplement lent, donc finalement vous n'avez pas d'autre choix que de renvoyer le message si vous je veux qu'il soit traité.

Donc, si le traitement en une seule fois est impossible, pourquoi de nombreux systèmes, y compris DBOS, prétendent-ils le fournir ?

L'astuce consiste à exploiter une autre propriété : l'idempotence. Si vous concevez un destinataire de message pour qu'il soit idempotent, vous pouvez lui transmettre un message plusieurs fois et tout ira bien car les livraisons en double n'ont aucun effet. Ainsi, la combinaison de la livraison au moins une fois et de l'idempotence est identique à la sémantique exactement une fois dans la pratique.

Sous le capot, c'est exactement ainsi que fonctionnent les récepteurs d'événements DBOS (comme pour Kafka). Ils génèrent une clé unique à partir d'un événement (par exemple, à partir d'un décalage de partition de sujet Kafka) et l'utilisent comme clé d'idempotence pour le workflow de traitement des événements. De cette façon, même si un événement est diffusé plusieurs fois, le workflow ne le traite qu'une seule fois.

Voici tout le code dont vous avez besoin pour traiter les messages Kafka exactement une fois :


from dbos import DBOS, KafkaMessage

@DBOS.kafka_consumer(config, ["topic"])
@DBOS.workflow()
def test_kafka_workflow(msg: KafkaMessage):
    DBOS.logger.info(f"Message received: {msg.value.decode()}")


En savoir plus ici !

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:qu'est-ce que DevopsArticle suivant:qu'est-ce que Devops