想要处理传入事件仅一次?
嗯,任何分布式系统学究都会说你不能,因为它理论上是不可能的。从技术上讲,他们是对的:如果你发送一条消息但没有得到答复,你就无法知道接收者是离线还是速度慢,所以最终你别无选择,只能再次发送消息,如果你想要处理它。
那么,如果一次性处理不可能,为什么包括 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中文网其他相关文章!