【发布时间】:2017-02-25 23:18:32
【问题描述】:
我喜欢将 azure 服务总线添加到我的一个项目中。该项目执行一些不同的任务:发送电子邮件、处理订单、发送发票等。
我想知道的是,我是否创建单独的队列来处理所有这些不同的任务?我知道一个队列有一个发送者和一个接收者。这是有道理的,但是我最终会为一个项目排好几个队列。这正常吗?
【问题讨论】:
标签: c# azure azureservicebus servicebus azure-servicebus-queues
我喜欢将 azure 服务总线添加到我的一个项目中。该项目执行一些不同的任务:发送电子邮件、处理订单、发送发票等。
我想知道的是,我是否创建单独的队列来处理所有这些不同的任务?我知道一个队列有一个发送者和一个接收者。这是有道理的,但是我最终会为一个项目排好几个队列。这正常吗?
【问题讨论】:
标签: c# azure azureservicebus servicebus azure-servicebus-queues
根据您的描述:
该项目执行一些不同的任务:发送电子邮件、处理订单、发送发票等。
这些消息彼此不相关。我喜欢区分命令和事件。命令被专门发送到某个目的地,期望得到结果,知道操作可能会失败。有了事件就不一样了。事件被广播,没有成功或失败的期望。也没有关于允许完全解耦的事件消费者的知识。事件只能使用Topics/Subscriptions 处理。可以使用Queues 或Topics/Subscriptions 处理命令(具有单个订阅的主题将充当队列)。
如果您使用事件,则不会创建单独的消费者输入队列。您创建一个主题和该主题的订阅。假设您将拥有一个PublisherApp 和一个ConsumerApp。 PublisherApp 可以创建一个主题并将所有消息发送到events 主题。 ConsumerApp 将创建所需的subscriptions,其中每个订阅将根据您希望订阅接收的消息类型有一个filter。对于您的示例,它将是以下订阅:
为了正确过滤,您的BrokeredMessages 必须有一个标头(属性)来表明意图。你可以想出一个自定义的header 或者使用一个标准的,比如Label。
我不久前写了一篇关于 ASB 拓扑的blog post,看看吧,它可能会给你更多关于如何设置实体的想法。
如果拓扑和实体管理不是您想做的事情,那么有一些很好的框架可以为您抽象它并允许您的代码在不深入细节的情况下工作。 NServiceBus 和 MassTransit 是两个很好的例子,你可以看看。
完全披露:我正在为 NServiceBus 开发 Azure 服务总线传输。
【讨论】:
查看this link的对照表
【讨论】:
主题和订阅最适合您的方案。 在订阅端,您可以根据条件过滤消息,在您的情况下,它可以是您的任务,即 sendemail,processorder 。
如果您以后想添加更多任务,您将无需对服务总线本身进行任何更改,而只需对发送方和接收方代码进行必要的更改。
如果您使用服务总线队列或存储队列,将来您必须创建更多队列来添加其他任务,并且在您的 Azure 基础架构的管理级别上可能会变得复杂。
【讨论】:
根据您的设计,有 2 种方法。
【讨论】: