C# 使用Azure服务总线队列和BrokeredMessage.ScheduledEnqueueTimeUtc续订

C# 使用Azure服务总线队列和BrokeredMessage.ScheduledEnqueueTimeUtc续订,c#,azure,azureservicebus,azure-servicebus-queues,C#,Azure,Azureservicebus,Azure Servicebus Queues,我有一个订阅模型,希望执行与续订相关的逻辑,如开具新发票、发送电子邮件等。例如,用户将在今天购买订阅,续订将在一年后进行。我最近一直在使用Azure队列,并且认为它会申请这样的续订 是否可以通过使用BrokeredMessage.ScheduledEnqueueTimeUtc()推送消息来使用Azure队列来处理此类长期计划消息 我使用它的时间比较短,比如在一分钟内发送通知,效果非常好 这样,我甚至可以让多个进程监听队列,并确保只有一个进程将执行更新逻辑。这将解决许多与锁定相关的问题,因为这是通

我有一个订阅模型,希望执行与续订相关的逻辑,如开具新发票、发送电子邮件等。例如,用户将在今天购买订阅,续订将在一年后进行。我最近一直在使用Azure队列,并且认为它会申请这样的续订

是否可以通过使用
BrokeredMessage.ScheduledEnqueueTimeUtc
()推送消息来使用Azure队列来处理此类长期计划消息

我使用它的时间比较短,比如在一分钟内发送通知,效果非常好


这样,我甚至可以让多个进程监听队列,并确保只有一个进程将执行更新逻辑。这将解决许多与锁定相关的问题,因为这是通过租赁和相关功能在Azure队列中内置的。

是的,您可以将其用于长期调度,调度消息与正常消息具有相同的保证。但有几件事你需要注意:

  • ScheduledEnqueueTimeUtc
    是消息在队列上可用(在数百毫秒内)但不需要传递的时间,这取决于队列的负载和状态。因此,它适用于业务流程,但不适用于对时间敏感(毫秒)的使用。在您的情况下,这不是问题,除非您的订阅取消对时间非常敏感
  • 它会影响您的存储配额(当前配额并不是问题,但如果您考虑到年份,这可能是个问题)
  • 据我所知,在
    scheduledQueueTimeUTC
    之前,您无法访问计划消息,因为它们是不可见的

从技术角度来看,这很好,但在你的情况下,如果你考虑几年,我还会考虑其他潜在问题:

  • 消息版本控制
  • 当您想将Azure更改为其他内容(AWS)时会发生什么情况
  • 如果您决定在明年将Azure Service Bus更改为NServiceBus,该怎么办

我正在考虑一种不同的方法,因为正如你所说,它可能会有很多坑落。可能我正试图使用数据库事务来达到同样的目的。我的主要问题是,没有两个进程会处理相同的通知消息/续订两次。不确定您的规模,但如果合理,您可以运行每日作业,该作业将处理续订或简单地将续订消息添加到服务总线队列。这样,您就有了一点两全其美的功能—可管理的时间范围和至少最多一次的处理。我们是否知道我们可以使用
scheduledeQueueTimeUTC
提前多少时间安排邮件,并继续期望可靠的传递?几天、几周、几个月?