ホームページ  >  記事  >  バックエンド開発  >  イベントを一度だけ処理する方法

イベントを一度だけ処理する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-07 06:08:30894ブラウズ

How To Process Events Exactly-Once

受信イベントを一度だけ処理したいですか?

まあ、分散システムの専門家なら誰でも、それは理論的に不可能なので、それはできないと言うでしょう。そして技術的には、彼らは正しいです。メッセージを送信して応答が得られない場合、受信者がオフラインなのか、単に遅いのかを知る方法がないため、最終的には、メッセージを再送信する以外に選択肢はありません。処理してほしい。

それでは、1 回限りの処理が不可能な場合、なぜ DBOS を含む多くのシステムがそれを提供すると主張するのでしょうか?

その秘訣は、もう 1 つの特性である 冪等性 を活用することです。メッセージ レシーバーを冪等になるように設計した場合は、そのレシーバーにメッセージを複数回配信できますが、重複した配信には影響がないため問題ありません。したがって、少なくとも 1 回の配信と冪等性の組み合わせは、実際には 1 回限りのセマンティクスと同じです。

内部的には、これが DBOS イベント レシーバー (Kafka など) の動作とまったく同じです。これらは、イベントから (たとえば、Kafka トピック パーティション オフセットから) 一意のキーを生成し、それをイベント処理ワークフローの冪等キーとして使用します。こうすることで、イベントが複数回配信された場合でも、ワークフローはイベントを 1 回だけ処理します。

Kafka メッセージを 1 回だけ処理するために必要なコードはすべて次のとおりです。


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()}")


詳細はこちら!

以上がイベントを一度だけ処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。