首页 > 文章列表 > 如何仅处理一次事件

如何仅处理一次事件

333 2025-03-24

如何仅处理一次事件

想要处理传入事件仅一次

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

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


在这里了解更多!

来源:https://dev.to/dbos/how-to-process-events-exactly-once-4dpo

本类最新

查看更多