Azure 服务总线队列

Azure Service Bus Queue

我喜欢将 azure 服务总线添加到我的一个项目中。该项目执行一些不同的任务:发送电子邮件、处理订单、发送发票等。

我很想知道的是,我是否创建了单独的队列来处理所有这些不同的任务?我知道队列有一个发送者和一个接收者。这是有道理的,但我最终会得到相当多的项目队列。这正常吗?

根据您的设计有 2 种方法。

  1. 队列和消息:消息正文有一个指示器任务:发送电子邮件、处理订单、发送发票等。代码然后相应地处理消息。
  2. 主题和订阅:为每个任务定义主题,并相应地处理代理消息。这应该比队列更好。
  1. 首先看一下 Azure 存储队列,我只是在几乎相同的情况下切换到它。在存储队列中,您无需为使用的内容支付月费。
  2. 队列不限于接收者或发送者。我的意思是,你可以有很多听众排队(如果你的应用程序被缩放)但是一旦听众拿起事件然后它被锁定并且对其他人不可见。 (默认情况下,Azure 存储队列中的超时时间约为 30 秒,服务总线中的超时时间约为 60 秒,因此请注意,如果您需要更多时间来处理您的消息,您需要更新锁,否则您最终将多次处理同一条消息)
  3. 您可以为所有事件使用一个队列,并且根据消息正文,您可以 运行 不同的消息处理器。例如,在我的项目中,我正在发送带有密钥 Type 的消息,它标识谁将处理此消息。您还可以为每种类型使用一个队列,然后在您的监听器中监听多个队列

this link比较table

根据您的描述:

The project does a few different tasks: sending email, processing orders, sending invoices etc.

这些消息彼此无关。我喜欢区分命令和事件。命令被专门发送到特定目的地,并期望得到结果,知道操作可能会失败。对于事件,情况有所不同。事件被广播,没有成功或失败的期望。也没有关于允许完全解耦的事件消费者的知识。只能使用 Topics/Subscriptions 处理事件。可以使用 QueuesTopics/Subscriptions 处理命令(具有单个订阅的主题将充当 queue)。

如果您使用事件,则不会创建单独的消费者输入 queue。您创建一个主题和关于该主题的订阅。假设您将有一个 PublisherApp 和一个 ConsumerAppPublisherApp 可以创建一个主题并将所有消息发送到 events 主题。 ConsumerApp 将根据您希望该订阅接收的消息类型创建所需的 subscriptions, where each subscription would have a filter。对于您的示例,它将是以下订阅:

  1. 发送邮件
  2. 流程订单
  3. 发送发票

为了正确过滤,您的 BrokeredMessage 必须有一个 header (属性) 来表明意图。您可以想出一个自定义 header 或使用标准的 Label.

前一段时间我写了一篇关于 ASB 拓扑的文章 blog post,看看吧,它可能会给你更多关于如何设置你的实体的想法。

如果拓扑和实体管理不是您想要做的,有一些很好的框架可以为您抽象它并允许您的代码工作w/o 过于深入细节。 NServiceBus and MassTransit 是两个很好的例子,您可以看看。

完全披露:我正在为 NServiceBus 开发 Azure 服务总线传输。

主题和订阅最适合您的场景。 在订阅端,您可以根据条件过滤消息​​,在您的情况下,它可以是您的任务,即 sendemail,processorder 。

如果您以后想添加更多任务,您将无需对服务总线本身进行任何更改,而只需对发送方和接收方代码进行必要的更改。

如果您使用服务总线队列或存储队列,将来,您必须创建更多队列来添加其他任务,这在您的 Azure 基础架构的管理级别上会变得复杂。