我想将azure服务总线添加到我的项目中。该项目还完成了一些不同的任务:发送电子邮件,处理订单,发送发票等。
我最想知道的是,我是否创建了单独的队列来处理所有这些不同的任务?我知道一个队列有一个发送者和一个接收者。这是有道理的,但后来我会为一个项目提供相当多的队列。那是正常的吗?
答案 0 :(得分:4)
根据您的说明:
该项目执行一些不同的任务:发送电子邮件,处理订单,发送发票等。
这些消息彼此无关。我喜欢区分命令和事件。命令被特定地发送到某个目的地,期望结果,知道操作可能失败。事件与众不同。广播事件,没有成功或失败的期望。对于允许完全脱钩的事件的消费者也没有了解。只能使用Topics
/ Subscriptions
处理事件。可以使用Queues
或Topics
/ Subscriptions
来处理命令(具有单个订阅的主题将充当队列)。
如果您使用事件,则不会创建单独的使用者输入队列。您可以在该主题上创建主题和订阅。假设您有一个PublisherApp
和一个ConsumerApp
。 PublisherApp
可以创建主题并将所有邮件发送到events
主题。 ConsumerApp
会创建所需的subscriptions,其中每个订阅的filter基于您希望订阅接收的邮件类型。对于您的示例,它将是以下订阅:
为了正确过滤,您的BrokeredMessage
必须有一个表示意图的标题(属性)。您可以提出自定义header或使用标准Label
。
我刚刚在ASB拓扑上写了blog post,看一看,它可能会给你更多关于如何设置实体的想法。
如果拓扑和实体管理不是你想要做的,有很好的框架可以为你抽象,并允许你的代码工作,而不是过多地深入细节。 NServiceBus和MassTransit是您可以看到的两个很好的例子。
完全披露:我正在为NServiceBus开展Azure Service Bus传输。
答案 1 :(得分:1)
查看this link的比较表
答案 2 :(得分:0)
根据您的设计,有两种方法。
答案 3 :(得分:0)
主题和订阅最适合您的方案。 在订阅端,您可以根据条件过滤消息,在您的情况下,它可以是您的任务,即sendemail,processorder。
如果您希望将来添加更多任务,您将无需对服务总线本身进行任何更改,并且只对发送方和接收方代码进行必要的更改。
如果您使用服务总线队列或存储队列,将来您必须创建更多队列以添加其他任务,并且它可能会在您的天蓝色基础架构的管理级别上变得复杂。