编辑人员注释:本文章由 Windows Azure Service Bus 团队的二级项目经理 Ruppert Koch 撰写。

上周,Microsoft 发布了 Azure SDK 2.2 和 Service Bus SDK 2.2。这两种 SDK 都具有新的 Service Bus 功能,即分区实体。利用这些 SDK(或通过在您的 HTTP 请求中指定 api-version=2013-10),可以在 Azure Service Bus 上创建和使用分区队列与主题,从而改进可靠性。与此同时,您还会发现,大多数用例中的最大消息吞吐量有所提高。

分区队列和主题是什么?

传统的队列或主题由单个消息代理进行处理并存储在一个消息贮存区中,而分区队列或主题由多个消息代理进行处理并存储在多个消息贮存区中。这意味着某个分区队列或主题的总吞吐量不再受单个消息代理或消息贮存区性能的限制。此外,一旦某个消息贮存区暂时中断,也不会导致任何一个分区队列或主题不可用。

简而言之,分区队列或主题的工作原理如下:每个分区队列或主题均由多个片段组成。每个片段存储在不同的消息贮存区中,并且由不同的消息代理进行处理。当一个消息发送到某个分区队列或主题时,Service Bus 会将该消息分配给其中一个片段。这一分配过程由 Service Bus 或发送方指定的分区键随机完成。如果客户端要从分区队列或分区主题的订阅接收某个消息,Service Bus 将检查所有片段中的消息。如果找到此类消息,它将挑选其中一个并将其传递给接收方。

启用分区

有三种方法来创建分区队列或主题。第一种方法是从您的应用程序创建队列或主题。启用分区,方法是将 QueueDescription.EnablePartitioning 或 TopicDescription.EnablePartitioning 属性设置为 true。这些标志必须在创建队列或主题时设置。不能对现有的队列或主题更改此属性。

或者,也可以在 Visual Studio 中创建分区队列或主题。我们在 New Queue 对话框和 New Topic 对话框中添加了一个新复选框 Enable Partitioning

第三种方法是通过 Windows Azure 门户。此功能需要等到下一次门户更新时才能使用,计划于几天后推出该更新。

请注意,当前 Azure Service Bus 的容量限制为每个命名空间仅容纳 100 个分区队列或主题。此外,分区队列和主题仅在 Azure Service Bus 中受支持,但在适用于 Windows Server的 Service Bus 1.1 中不可用。

分区键的使用

当消息在分区队列或主题中队列时,Service Bus 将检查是否存在分区键。如果找到分区键,它将基于该键选择片段。如果未找到分区键,它将基于内部算法选择片段。

使用分区键

在某些情况下(如会话或事务),需要将消息存储在某一片段中。在所有此类情况下,均需使用分区键。使用相同分区键的所有消息会分配给同一片段。

根据具体情况,可以使用不同的消息属性作为分区键:

SessionId。如果某个消息设置了 SessionId 属性,Service Bus 将使用 SessionId 属性作为分区键。这样,属于同一会话的所有消息均将分配给同一片段,并且由同一个消息代理进行处理。这样,Service Bus 就可以保障消息顺序以及会话状态的一致性。

PartitionKey。如果某个消息设置了 PartitionKey 属性但未设置 SessionId 属性,Service Bus 将使用 PartitionKey 属性作为分区键。使用 PartitionKey 属性可以发送非会话的事务性消息。该分区键确保在一个事务内发送的所有消息均由同一个消息代理进行处理。

MessageId。当队列或主题的 RequiresDuplicationDetection 属性设置为 true 时,如果 SessionId 或 PartitionKey 属性未设置,则使用 MessageId 属性作为分区键。这可以确保同一个消息的所有副本均由同一个消息代理进行处理,从而使 Service Bus 可以检测和消除重复消息。

不使用分区键

如果没有分区键,Service Bus 采用轮循方式将消息分发给分区队列或主题的所有片段。如果所选片段不可用,Service Bus 会将消息分配给其他片段。这样,尽管一个消息贮存区暂时不可用,发送操作仍会成功。

如您所见,分区键可以将消息固定到某个特定的片段。如果此片段所在的消息贮存区不可用,Service Bus 将返回错误。如果没有分区键,Service Bus 则可以挑选不同的片段,操作将成功。因此,除非必要,否则建议您不要提供分区键。

使用带有分区实体的事务

对于在事务中发送的消息,必须指定分区键。此分区键可以是 SessionId、PartitionKey 或 MessageId。对于同一事务中发送的所有消息,必须指定相同的分区键。

可以使用以下代码向分区队列发送事务性消息:

如果您需要向会话感知队列或主题发送事务性消息,该消息必须已经设置 SessionId 属性。如上所述,SessionId 属性可作为分区键。如果同时还设置了 PartitionKey 属性,其值必须与 SessionId 属性相同。

与普通队列或主题不同的是,不能使用一个事务将多个消息发送到不同会话。

其他信息

有关分区队列和主题的更多详细信息,请访问 http://msdn.microsoft.com/en-us/library/dn520246.aspx,并查阅 Service Bus 分区队列示例。

本文翻译自:

http://blogs.msdn.com/b/windowsazure/archive/2013/10/29/partitioned-service-bus-queues-and-topics.aspx

转载于:https://www.cnblogs.com/wuwa/p/6192022.html

分区 Service Bus 队列和主题相关推荐

  1. java message bus_【Microsoft Azure学习之旅】消息服务Service Bus的学习笔记及Demo示例...

    今年项目组做的是Cloud产品,有幸接触到了云计算的知识,也了解并使用了当今流行的云计算平台Amazon AWS与Microsoft Azure.我们的产品最初只部署在AWS平台上,现在产品决定同时支 ...

  2. Windows Azure Service Bus (3) 队列(Queue) 使用VS2013开发Service Bus Queue

    <Windows Azure Platform 系列文章目录> 在之前的Azure Service Bus中,我们已经介绍了Service Bus 队列(Queue)的基本概念. 在本章中 ...

  3. Windows Azure Service Bus (5) 主题(Topic) 使用VS2013开发Service Bus Topic

    <Windows Azure Platform 系列文章目录> 项目文件,请在这里下载 在笔者之前的文章中Windows Azure Service Bus (1) 基础 介绍了Servi ...

  4. 【Microsoft Azure学习之旅】测试消息队列(Service Bus Queue)是否会丢消息

    组里最近遇到一个问题,微软的Azure Service Bus Queue是否可靠?是否会出现丢失消息的情况? 具体缘由如下, 由于开发的产品是SaaS产品,为防止消息丢失,跨Module消息传递使用 ...

  5. Oracle Service Bus简介

    我们正在为电信提供商设计一个新系统,在该系统中,我们研究了用作企业服务总线的Oracle服务总线(OSB). 对我来说,第一个优点是它提供了惊人的工具支持. 通过将其捆绑为Oracle SOA套件,O ...

  6. 阿里云ONS而微软Azure Service Bus体系结构和功能比较

    阿里云ONS而微软Azure Service bus体系结构和功能比较 版权所有所有,转载请注明出处http://blog.csdn.net/yangzhenping.谢谢! 阿里云的开放消息服务: ...

  7. oracle线程阻塞_Oracle Service Bus –线程阻塞案例研究

    oracle线程阻塞 本案例研究描述了在AIX 6.1和IBM Java VM 1.6上运行的Oracle Service Bus 11g遇到的线程阻塞问题的完整根本原因分析过程. 本文也是您提高线程 ...

  8. Oracle Service Bus –线程阻塞案例研究

    本案例研究描述了在AIX 6.1和IBM Java VM 1.6上运行的Oracle Service Bus 11g遇到的线程阻塞问题的完整根本原因分析过程. 本文也是您提高线程转储分析技能的绝佳机会 ...

  9. 使用VS code 创建 Azure Functions,从blob触发,解析,发送至Service Bus

    场景: 某设备定时于每天23:00左右将一天的运行日志.devicelogtxt上传到Azure Blob,期待Blob文件上传后, 自动通过Azure Functions 解析文件并将文件内容写入到 ...

最新文章

  1. tensorflow.reshap(tensor,shape,name)的使用说明
  2. matlab模拟钢琴演奏
  3. sap新总账中 CodingBlock客户化自定义新字段方法
  4. java实例拷贝,Apache Commons包 BeanUtils 对象拷贝实例demo
  5. 《C++ Primer》10.1节练习
  6. 安装telnet_Flask干货:Memcached缓存系统——Memcached的安装
  7. plsql tables 没有表_技术分享 | 在磁盘上查找 MySQL 表的大小
  8. 16位汇编第一讲简介
  9. 长春市职称计算机考试成绩查询,长春市助理工程师查询网站
  10. 003_创建simulink文件
  11. 腾讯优图实验室招聘计算机视觉研究员和实习生
  12. 通过mtd读写flash_【转】 Linux下读写FLASH驱动——MTD设备分析
  13. Python作为移动客户端后台服务器
  14. 模板脚手架资质怎么办理
  15. springboot之Filter指定过滤URL的常见问题
  16. 菜鸟初学JQuery
  17. 二维码解码芯片最新三款的二维码芯片MCU不同之处
  18. Docker镜像拉取报错:Error response from daemon: Get https://registry-1.docker.io/v2/
  19. 【C语言进阶17——程序环境和预处理】
  20. 专门写给yuki同学

热门文章

  1. 201521123009 《Java程序设计》第11周学习总结
  2. jenkind + git + mave + shell + tomcat
  3. 一个事务复制的bug--更新丢失
  4. Q95:纹理映射(Texture Mapping)(3)——Triangle Meshes
  5. 水很深的深度学习-Task02机器学习基础
  6. 怎样的数据分析才有价值
  7. Html代码打包后如何修改,html代码打包封装成APP教程
  8. hikari如何切换数据源_spring boot+mybatis 多数据源切换(实例讲解)
  9. ln -s命令 linux_浅谈linux中ln命令,附带案例
  10. python怎样装pandas_小白学python:坑一:如何安装pandas和numpy