选择使用.NET服务总线队列还是Azure队列服务

32

关于Azure应用程序的一个问题:如果我有多个Web和Worker角色需要通信,文档中建议使用Azure队列服务。

然而,我刚刚了解到新的.NET Service Bus现在也提供队列。这些看起来更加强大,因为它们似乎提供了更详细的API。虽然NSB看起来更有趣,但是它有一些问题,让我担心在分布式应用程序中使用它。(例如,队列过期……如果我不能保证队列及时更新,我可能会失去它!)

有没有人使用过这两种技术,并且可以给出任何建议,告诉我们何时选择其中一种技术?

我猜测,虽然服务总线看起来更强大,但由于我的用例实际上只是使Web/Worker角色之间相互通信,所以Azure队列服务才是我需要的。但是,在编程之前,我只是想确认一下这一点,以免将自己束缚在一个角落里 :-)

提前感谢您。

更新

在休息期间了解了这两个系统。看起来.NET service bus更专门设计用于集成系统,而不是提供通用可靠的消息传递系统。Azure队列是分布式的,因此在可靠性和可扩展性方面比NSB队列更加适合在Azure中托管的代码。

感谢回复。


这里有一篇完整的 MSDN 文章,比较了两种服务: Windows Azure Queues 和 Windows Azure Service Bus Queues - 比较和对比。非常有趣! - JYL
1
MS文档存储队列和服务总线队列-比较和对比回答了这个问题。 - Michael Freidgeim
1
更广泛的问题在在Azure中我应该使用什么消息队列?一文中有所涉及。 - Michael Freidgeim
6个回答

31

存储队列 vs 服务总线

以下是我在思考这个问题时考虑到的一些不同因素。

可用性

自从去年十一月的存储中断后,Azure承诺他们将永远不会再次将代码部署到所有区域 - 因为他们已经将此功能纳入系统,使其不可能。 https://azure.microsoft.com/en-us/blog/final-root-cause-analysis-and-improvement-areas-nov-18-azure-storage-service-interruption/

以下是msdn关于可用性的说明:

如果您已经在使用Azure存储Blob或Table,并开始使用队列,则可以保证99.9%的可用性。如果您使用Blob或Table与服务总线队列,则可用性较低。

Azure队列旨在支持应用程序组件的解耦,以增加可扩展性和故障容忍度。

开发

就我个人而言,我很熟悉存储API,并且在大多数应用程序的其他领域中都需要其Blob存储。存储队列使用与存储Blob相同的SDK。 Azure队列提供了跨队列,表和BLOB的统一和一致的编程模型。

成本

服务总线支持的接收和删除模式提供了减少消息操作计数(以及相关成本)以换取降低的传递保证的能力。

似乎有一些关于服务总线成本控制的工具可以利用,如果您不得不开始保持运行应用程序的预算 - 我尝试在下面分解了潜在的存储队列成本 :)。对于GRS超过40,000个队列/小时,每月成本不到一百美元。与我们其他存储成本合并在一起,我不认为集中削减成本有益处。(带宽对两者都是相同的,因此在比较时互相抵消)

存储定价

你可以获得无限制的免费队列和操作 - 你只需要支付空间费用。

  • 假设平均每个消息大小为30K。
  • 假设1MB等于1000K而非1024。
  • 假设你不会超过1TB后的分阶价格。

30K / 1条消息 * 1 TB / 1000000000K * $.095 / 1 GB * 1000GB / 1 TB = $0.00000285 / 消息,对于第一个TB的使用。

1个消息 / ~30K * 1000000000K / 1 TB = 1TB中的33333333个消息。

33333333个消息 * $0.00000285 / 消息 = 大约$95美元,对于第一个TB。

在一个月内分散开来,我们可以利用这1TB处理大约40,000条消息/小时。

Service Bus定价

  • 10美元/月的基本价格
  • 按操作收费(任何api调用都是一个操作)- 添加队列/接收队列/监视队列/等等。
  • 你可以获得每月1250万次免费操作。
  • 在此之后的每百万次操作收费。

很难估计使用情况,但1亿次操作的成本是80美元/月。

批量接收

Storage可以通过指定消息计数来批量最多32个消息,而Service Bus允许队列客户端将多个消息批量发送到单个操作中。

因此,存储是批量接收,而服务总线是批量发送。

监控

Azure Queues使您能够获得针对队列执行的所有事务的详细日志,以及聚合指标。这种支持在Service Bus中不是开箱即用的 - 但可能可以在某个地方找到预构建的解决方案。

转发

Service Bus具有一个自动转发功能,而存储队列则没有。

自动转发使得数千个队列可以将他们的消息自动转发到一个单一的队列,接收应用程序从该队列中消费消息。你可以使用此机制来实现安全性、控制流和在每个消息发布者之间隔离存储。

重复

Service Bus队列支持的重复检测功能会根据MessageID属性的值自动删除发送到队列或主题的重复消息。

存储队列消息可能会无预警地重复。

元数据

Service Bus给您一个消息头+正文的两个部分。这是一个非常有用的功能,适用于全球部署的基础设施。让您可以为消息添加区域名称和实例ID等内容。队列消息只是简单的字符串。另一方面,Azure存储队列提供了对队列描述可应用的任意属性的支持,以名称/值对的形式。因此,您可以在Service Bus中装饰消息,在存储队列中装饰队列。

交付保证

Service Bus提供At-Most-Once和At-Least-Once,而队列仅提供At-Least-Once交付。如果并发订阅者成为问题,这可能会限制我们使用队列的能力。

性能

Azure存储队列提供10毫秒的延迟(在数据中心内),而Service Bus提供20-25毫秒的延迟。如果需要,Service Bus提供长轮询会比10毫秒更好。

安全性

存储队列使用主/辅共享密钥,而Service Bus通过Active Directory提供了Sender/Receiver/Admin角色的RBAC。

参考

  • http://azure.microsoft.com/zh-cn/pricing/details/service-bus/
  • https://alexandrebrisebois.wordpress.com/2013/10/20/windows-azure-storage-queues-vs-windows-azure-service-bus-queues/
  • 注:以上链接分别为 Azure Service Bus 官网和一篇介绍 Windows Azure 存储队列(Windows Azure Storage Queues)和 Azure Service Bus 队列(Azure Service Bus Queues)差异的博客。

    13

    我建议您在Web角色和Worker角色之间使用Azure队列进行通信。 使用队列是在Azure进程之间进行通信的官方和授权方式,我真的怀疑您会编写出死胡同的程序。 Service Bus(AppFabric)有更高的开销,虽然非常适合与外部应用程序交互,但对于Azure应用程序内部的快速简单消息可能不是最理想的选择。


    1
    将.NET Standard集成到Azure ServiceBus队列是一场噩梦(3天还没完成 :( ),而AWS只用了半个小时就完成了集成。 - Saw
    2
    问题是在2009年,而现在我们已经是2017年了 :( :( :( 看来情况正在发生变化。 - Saw

    0
    据我所知,Service Bus(之前的名称)已经有了队列一段时间了,但这些队列不能保证消息的传递 - 祝你好运!

    1
    Service Bus Queue现在具有最多和至少一次的交付保证。http://msdn.microsoft.com/zh-cn/library/azure/hh767287.aspx - TheDude
    5
    用了五年的时间! - TobyEvans

    0

    开发人员学习的与队列相关的模式可以应用于两者。 从可靠性和实现易用性的角度来看,两者都可以使用。

    仅存储队列可以做到的事情 1)处理消息的工作程序崩溃。随后的工作程序想要读取消息的状态,以便从先前工作程序停止的地方继续执行。 2)您需要服务器端日志记录针对您的队列执行的所有事务。

    但是比较并不重要。如果我们需要自定义队列开发,则始终使用存储队列。它是由Microsoft首先开发的。服务总线是通过复制BizTalk带入的,目的是集成(混合),因此该系列中有高级功能:会话、事务、自动死信等。

    此链接 提供了一份比较,此链接 也提供了一份比较。分析所有内容并开始敏捷开发将很困难,因此上述规则。


    0
    为了非常清楚,这是对比两个在不同时间点出于不同原因创建的Azure组件。 存储队列和服务总线队列-比较和对比 Azure支持两种类型的队列机制:存储队列和服务总线队列。存储队列是Azure存储基础架构的一部分,具有简单的基于REST的GET/PUT/PEEK接口,在服务之间提供可靠的持久化消息。服务总线队列是广泛的Azure消息基础架构的一部分,支持排队以及发布/订阅和更高级的集成模式。有关服务总线队列/主题/订阅的更多信息,请参见服务总线概述。
    虽然这两种排队技术同时存在,但存储队列首先推出,作为建立在Azure存储服务之上的专用队列存储机制。服务总线队列建立在更广泛的消息基础架构之上,旨在集成可能跨越多个通信协议、数据合同、信任域和/或网络环境的应用程序或应用程序组件。

    0

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接