想要處理傳入事件僅一次?
嗯,任何分散式系統學究都會說你不能,因為它理論上是不可能的。從技術上講,他們是對的:如果你發送一條訊息但沒有得到答复,你就無法知道接收者是離線還是速度慢,所以最終你別無選擇,只能再次發送訊息,如果你想要處理它。
那麼,如果一次性處理不可能,為什麼包括 DBOS 在內的許多系統都聲稱提供它?
訣竅是利用另一個屬性:冪等性。如果您將訊息接收者設計為冪等的,那麼您可以多次向其傳遞訊息,這沒有問題,因為重複傳遞沒有任何效果。因此,至少一次傳遞和冪等性的組合在實踐中與精確一次語義相同。
在幕後,這正是 DBOS 事件接收器(如 Kafka)的工作方式。它們從事件(例如,從 Kafka 主題分區偏移量)產生唯一鍵,並將其用作事件處理工作流程的冪等性鍵。這樣,即使一個事件被多次傳遞,工作流程也只處理一次。
以下是一次處理 Kafka 訊息所需的所有程式碼:
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中文網其他相關文章!