存储队列与服务总线
以下是我在思考这个问题时的一些不同考虑因素的细分。
可用性
自去年 11 月的存储中断以来,Azure 承诺他们永远不会再次将代码部署到所有区域 - 将其内置到系统中以使其成为不可能。 https://azure.microsoft.com/en-us/blog/final-root-cause-analysis-and-improvement-areas-nov-18-azure-storage-service-interruption/
以下是 msdn 关于可用性的说明:
如果你已经在使用 Azure 存储 Blob 或表并开始使用队列,则可以保证 99.9% 的可用性。如果将 Blob 或表与服务总线队列一起使用,则可用性会降低。
Azure 队列旨在支持应用程序组件的解耦,以提高可伸缩性和对故障的容忍度。
发展
就个人而言,我对存储 API 很满意,并且在大多数应用程序的其他领域已经需要它的 blob 存储。存储队列使用与存储 blob 完全相同的 sdk。Azure 队列提供跨队列、表和 BLOB 的统一且一致的编程模型
成本
服务总线支持的接收和删除模式提供了减少消息传递操作计数(和相关成本)以换取降低交付保证的能力。
似乎有一些围绕服务总线成本控制的工具,如果您必须开始保持预算来运行您的应用程序,您可以利用这些工具 - 我尝试在下面分解潜在的存储队列成本:)。GRS 每小时排队超过 40,000 条,每月花费不到 100 美元。与我们的其他存储成本一起,我认为专注于削减成本并没有什么好处。(两者的带宽相同,比较时会自行抵消)
存储定价
您可以获得无限的免费队列和操作 - 您需要为空间付费
- 假设平均 30K 消息大小
- 假设 MB 中的 1000K 而不是 1024
- 假设您不会达到 1TB 以上的分级定价
30K / 1 条消息 * 1 TB / 1000000000K * $.095 / 1 GB * 1000GB / 1 TB = $0.00000285 / 第一 TB 使用的消息
1 条消息 / ~30K * 1000000000K / 1 TB = 33333333 条消息在一个 TB 中
33333333 条消息 * 0.00000285 USD / 消息 = 第一个 TB 约 95 美元
分布在一个月内,我们可以用第一 TB 每小时处理 40,000 条消息
服务总线定价
- 10块一个月基本价格
- 按操作付费(任何 api 调用都是操作) - 添加队列/接收队列/监控队列/等。
- 您每月获得 1250 万次免费操作
- 之后支付每百万次操作
很难估计这里的使用量,但 1 亿次操作每月花费 80 美元
批量接收
通过在检索消息时指定消息计数,存储最多可以批处理 32 条消息,而服务总线允许队列客户端将多条消息批处理到单个发送操作中。
所以存储是批量接收,而服务总线是批量发送。
监控
Azure 队列使您能够获取针对队列执行的所有事务的详细日志以及聚合指标。这种支持并不是服务总线开箱即用的——但可能会在某处找到预构建的解决方案。
转发
服务总线具有缺少存储队列的自动转发功能。
自动转发使数千个队列能够将它们的消息自动转发到单个队列,接收应用程序从该队列中消费消息。您可以使用此机制来实现每个消息发布者之间的安全性、控制流和隔离存储。
重复
服务总线队列支持的重复检测功能会根据 MessageID 属性的值自动删除发送到队列或主题的重复消息。
存储队列消息可以在没有警告的情况下重复。
元数据
服务总线为您提供消息头+正文的 2 部分。对于全球部署的基础架构,这是一个非常有用的功能。让您使用区域名称和实例 ID 等内容来装饰您的消息。队列消息是简单的字符串。另一方面,Azure 存储队列以名称/值对的形式提供对可应用于队列描述的任意属性的支持。所以可以在Service Bus中装饰消息,用存储队列装饰队列
交货保证
Service Bus 提供 At-Most-Once 和 At-Least-Once,而 Queues 仅提供 At-Least-Once 交付。如果并发订阅者成为问题,这可能会限制我们使用队列的能力。
表现
Azure 存储队列提供 10 毫秒延迟(在数据中心内),而服务总线 20-25 毫秒延迟。服务总线确实提供了长轮询,如果您有需要,它甚至会超过 10 毫秒。
安全
存储队列使用主要/次要共享密钥,而服务总线通过具有发送者/接收者/管理员角色的 Active Directory 提供 RBAC。
参考