【问题标题】:Azure Service Bus QueueAzure 服务总线队列
【发布时间】:2017-02-25 23:18:32
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    根据您的描述:

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

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

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

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

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

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

    如果拓扑和实体管理不是您想做的事情,那么有一些很好的框架可以为您抽象它并允许您的代码在不深入细节的情况下工作。 NServiceBusMassTransit 是两个很好的例子,你可以看看。

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

    【讨论】:

      【解决方案2】:
      1. 首先看一下 Azure 存储队列,我只是在几乎相同的场景中切换到它。在存储队列中,您无需为使用的内容支付月费。
      2. 队列不限于接收者或发送者。我的意思是,您可以为一个队列设置许多侦听器(以防您的应用程序被缩放),但是一旦侦听器接收到事件,它就会被锁定并且对其他人不可见。 (默认情况下,Azure 存储队列中的超时时间约为 30 秒,服务总线中的超时时间为 60 秒,因此请注意,如果您需要更多时间来处理消息,则需要更新锁定,否则您最终会多次处理相同的消息)
      3. 您可以为所有事件使用一个队列,并且根据消息正文,您可以运行不同的消息处理器。例如,在我的项目中,我正在发送带有 Type 键的消息,该键标识谁将处理此消息。您还可以为每种类型使用一个队列,然后在您的侦听器中监听多个队列

      查看this link的对照表

      【讨论】:

      • ASQ 是一种排队服务,而不是消息服务。虽然 ASB 服务 需要按月付费,但您可以在使用 ASB 服务时拥有多个命名空间。 ASQ 不具备 ASB 所具备的功能:死信、消息转发、消息延迟、原子操作、事件等。如果应用程序不需要这些,那么绝对不需要。否则,就我个人而言,我会继续使用 ASB,因为它是一个非常出色的消息服务。
      • @SeanFeldman 我同意,此外,ASQ 没有先进先出,但作为一个队列系统,它运行良好,并且有一个好处,您可以使用模拟器工作
      • 讽刺的是,实际上恰恰相反。 ASB 可以支持 ASQ 不能的订购。 azure.microsoft.com/en-us/documentation/articles/… 就个人而言,我不鼓励人们依赖消息传递的顺序。使用 ASB 或 ASQ 消息锁可能会丢失并且订单会超出窗口。
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2015-07-18
          • 1970-01-01
          • 1970-01-01
          • 2020-12-17
          • 2018-04-01
          • 2013-08-19
          • 2015-06-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多