Azure Service Bus队列

时间:2016-10-17 04:27:07

标签: c# azure azureservicebus servicebus azure-servicebus-queues

我想将azure服务总线添加到我的项目中。该项目还完成了一些不同的任务:发送电子邮件,处理订单,发送发票等。

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

4 个答案:

答案 0 :(得分:4)

根据您的说明:

  

该项目执行一些不同的任务:发送电子邮件,处理订单,发送发票等。

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

如果您使用事件,则不会创建单独的使用者输入队列。您可以在该主题上创建主题和订阅。假设您有一个PublisherApp和一个ConsumerAppPublisherApp可以创建主题并将所有邮件发送到events主题。 ConsumerApp会创建所需的subscriptions,其中每个订阅的filter基于您希望订阅接收的邮件类型。对于您的示例,它将是以下订阅:

  1. 的SendMail
  2. ProcessOrder
  3. SendInvoice
  4. 为了正确过滤,您的BrokeredMessage必须有一个表示意图的标题(属性)。您可以提出自定义header或使用标准Label

    我刚刚在ASB拓扑上写了blog post,看一看,它可能会给你更多关于如何设置实体的想法。

    如果拓扑和实体管理不是你想要做的,有很好的框架可以为你抽象,并允许你的代码工作,而不是过多地深入细节。 NServiceBusMassTransit是您可以看到的两个很好的例子。

    完全披露:我正在为NServiceBus开展Azure Service Bus传输。

答案 1 :(得分:1)

  1. 首先看看Azure存储队列,我刚刚在几乎相同的场景中切换到它。在存储队列中,您不需要为使用的内容支付每月付款费用。
  2. 队列不仅限于接收者或发件人。我的意思是,你可以有一个队列的许多听众(万一你的应用程序被缩放)但是一旦听众拿起事件然后它被锁定而其他人看不到。 (默认情况下,Azure存储队列中的超时时间约为30秒,服务总线中超时时间为60秒,因此请注意,如果您需要更多时间处理邮件,则需要续订锁定,否则最终会多次处理相同的邮件)
  3. 您可以为每个事件使用一个队列,并依赖于可以运行不同消息处理器的消息体。例如,在我的项目中,我发送的消息包含 Type 键,用于标识将要处理此消息的人员。您还可以为每种类型使用一个队列,然后在侦听器中侦听多个队列
  4. 查看this link的比较表

答案 2 :(得分:0)

根据您的设计,有两种方法。

  1. 队列和消息:消息正文有一个指示器任务:发送电子邮件,处理订单,发送发票等。然后代码会相应地处理消息。
  2. 主题和订阅:定义每个任务的主题,并相应地处理代理消息。这应该比队列更好。

答案 3 :(得分:0)

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

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

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