受信イベントを一度だけ処理したいですか?
まあ、分散システムの専門家なら誰でも、それは理論的に不可能なので、それはできないと言うでしょう。そして技術的には、彼らは正しいです。メッセージを送信して応答が得られない場合、受信者がオフラインなのか、単に遅いのかを知る方法がないため、最終的には、メッセージを再送信する以外に選択肢はありません。処理してほしい。
それでは、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 サイトの他の関連記事を参照してください。