gpt4 book ai didi

c# - Azure 服务总线队列 - 如何防止 IHostedService 立即处理队列消息

转载 作者:行者123 更新时间:2023-12-03 05:12:08 25 4
gpt4 key购买 nike

背景 - 我正在创建消息并将其放置在 Azure 服务总线队列上,并使用 IHostedService 处理消息。

问题 - 有什么方法可以在我的 IHostedService MessageHandler 方法中创建延迟,以便在消息放入队列后不立即处理消息?

我想这样做的原因是,在我将消息放入队列后,我想获取返回的标识符并将其与其他一些步骤一起存储在数据库中。但目前我的消息被拾取并且由 IHostedService 立即处理

最佳答案

消息传递是为了将生产者和消费者解耦。这意味着消费者不应该知道生产者的约束,反之亦然。消息传递正在将两方脱钩。这意味着只要队列中有消息,处理器就应该能够处理它。

建议的延迟安排消息的选项可以工作,但它有一个潜在的缺陷。如果一条消息已被调度并且已获得其序列号,但系统此时无法访问数据库,则该消息很可能会出现在队列中,但数据库不会有序列号。

有哪些替代方案?

消息延迟

Deferred messages remain in the main queue along with all other active messages (unlike dead-letter messages that live in a subqueue), but they can no longer be received using the regular receive operations.

To retrieve a deferred message, its owner is responsible for remembering the sequence number as it defers it. Any receiver that knows the sequence number of a deferred message can later receive the message by using receive methods that take the sequence number as a parameter.

source

消费者 IHostedService 可以做的是接收消息,检查数据库中的附加信息是否可用,如果不可用,则将消息连同计划的消息一起推迟到自身,这将包含延迟消息的序列号,通过该序列号可以检索原始(延迟)消息。通过这种方式,您可以控制尝试次数并决定如果随附的步骤从未写入数据库则要执行的操作。

路由滑动模式

The reason I want to do this is that after I place a message on the queue I want to take the identifier returned and store it in the database along with a few other steps.

如果这些步骤与后续处理相关,例如消息应发送到的下一个目的地或类似的 routing slip图案比较合适。您可以将其他步骤/附加数据与消息一起打包并发送。这样,消息是 self 维持的,不依赖于数据库,不必计划/延迟/延迟,并且每一步都可以根据流程进行扩充和修改。

关于c# - Azure 服务总线队列 - 如何防止 IHostedService 立即处理队列消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76180632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com