想要处理传入事件仅一次?
嗯,任何分布式系统学究都会说你不能,因为它理论上是不可能的。从技术上讲,他们是对的:如果你发送一条消息但没有得到答复,你就无法知道接收者是离线还是速度慢,所以最终你别无选择,只能再次发送消息,如果你想要处理它。
那么,如果一次性处理不可能,为什么包括 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()}")
登录后复制
在这里了解更多!
以上就是如何仅处理一次事件的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2191917.html