跳到主要内容

分区扩展

分区扩展是指向分区队列添加或移除分区。当管理员更改队列的分区计数时,会触发分区扩展。

当分区计数减少时,事件代理会以相反的顺序(即,最高编号的分区首先被移除)移除多余的分区。任何在已删除分区中剩余的消息也会被删除。

当分区计数增加时,事件代理会为每个新分区分配序列中下一个最高的分区编号。

分区扩展会在事件代理上触发分区再平衡(Partition Rebalancing)过程。分区交接(Partition Handoff)的影响也适用于分区扩展。

可能更倾向于将一些消息负载转移到另一个分区队列,或者配置一个具有更多分区的新分区队列,而不是更改现有分区队列的配置。

分区扩展会影响服务。

添加和移除分区

当分区计数变化时,键到分区的映射会变化。其影响是消费者会收到与之前不同的一组消息。没有简单的方法可以保护消费者免受这种变化的影响。

由于对消费者的影响,我们建议您在更改分区数量之前禁用分区队列的入站消息,以允许所有现有分区中的消息排空。

发布应用程序的确切影响取决于队列的reject-msg-to-sender [including-when-shutdown]设置选择。如果不能接受发布消息丢失,您必须启用此设置(包括在队列关闭时)。此属性的默认值,像所有队列一样,是启用reject-msg-to-sender(但在队列关闭时不启用)。因此,如果默认值没有更改,您可以预期在按照以下程序更改分区计数时会出现消息丢失。有关此设置的更多信息,请参见配置消息丢弃处理。

更改分区计数对消息传递有重大影响。事件代理不维护键到分区映射的历史记录(事件代理使用分区键的哈希计算映射)。因此,当分区计数变化时,具有相同键的后续消息最有可能被交付给不同的消费者,不是因为分区到消费者映射发生了变化,而是因为键到分区映射发生了变化。

当分区计数增加时,只有在所有新分区都创建后,新计数才会生效(键到分区映射被重新计算)。

如果您将队列从分区更改为非分区,或反之,则事件代理会解绑所有已绑定到队列的客户端。这确保事件代理和客户端一致地使用(或不使用)分区队列的语义。请注意,任何在移除的分区中剩余的消息也会被移除。

如果您将队列从非分区更改为分区,变更时在队列中的消息可能会卡住,因为事件代理在队列变为分区后不再从父队列传递消息。在这种情况下,您可以从父队列中复制消息。

分区扩展会影响服务。确保您按照以下提供的确切程序添加或移除分区。

添加分区

要添加分区(即,增加分区计数),请执行以下操作:

  1. 禁用队列的入站消息。出站消息(即,向活动消费者传递消息)继续对队列中已有的消息进行。
  2. 等待队列的所有分区的所有未决消息被完全传递。
  3. 如果队列是复制的,等待DR-standby事件代理上的所有消息被确认或消费。
  4. 增加队列的分区计数。
  5. 等待事件代理分配新分区并完成分区再平衡。
  6. 如果队列是复制的,等待DR-standby事件代理分配其新分区并完成分区再平衡过程。
  7. 启用队列的入站消息。

移除分区

要移除分区(即,减少分区计数),请执行以下操作:

  1. 禁用队列的入站消息。出站消息(即,向活动消费者传递消息)继续对队列中已有的消息进行。
  2. 等待队列的所有分区的所有未决消息被完全传递。
  3. 如果队列是复制的,等待DR-standby事件代理上的所有消息被确认或消费。
  4. 减少队列的分区计数。
  5. 等待事件代理释放多余的分区并完成分区再平衡。
  6. 如果队列是复制的,等待DR-standby事件代理释放其多余的分区并完成分区再平衡过程。
  7. 启用队列的入站消息。

分区扩展状态

分区队列可以具有以下扩展状态之一:

  • 就绪 - 在此状态下,队列具有预期数量的分区分配。
  • 扩展中 - 队列的分区数量不足。必须创建下一个分区。在所有新分区都创建之前,新分区不会被分配给流程。
  • 缩减中 - 队列的分区数量过多。必须删除最后创建的分区。事件代理会立即停止使用多余的分区(它从流程中取消分配它们)。这些分区中的任何消息都会丢失。