PHP前端开发

如何仅处理一次事件

百变鹏仔 4天前 #Python
文章标签 事件

想要处理传入事件仅一次

嗯,任何分布式系统学究都会说你不能,因为它理论上是不可能的。从技术上讲,他们是对的:如果你发送一条消息但没有得到答复,你就无法知道接收者是离线还是速度慢,所以最终你别无选择,只能再次发送消息,如果你想要处理它。

那么,如果一次性处理不可能,为什么包括 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()}")

在这里了解更多!