我认为使用分区队列和主题的权衡是不再保证消息排序。
由于消息默认情况下循环发送到每个片段/分区,因此这意味着不再保证消息顺序。有谁能确认一下是否是这样吗?
从分区队列接收交易时如何保证消息排序。
使用会话是支持分区队列/主题的 FIFO 消息排序的唯一方法吗?我假设同一会话/分区键的所有消息至少都会以 FIFO 方式传递?
我在博客文章中发现了这一点。
希望有帮助!
会话 ID。如果消息设置了 SessionId 属性,则服务总线将使用 SessionId 属性作为分区键。这样,属于同一会话的所有消息都将分配给同一片段并由同一消息代理处理。这使得服务总线能够保证消息排序以及会话状态的一致性。
仅仅因为您没有使用分区队列或主题并不意味着您将获得 FIFO。如果您有多个阅读器或执行异步操作,那么不会,除非您使用上面指出的会话,否则您将不会获得 FIFO。请使用会话。
上面的答案中遗漏了关于 FIFO 的重要一点。
当消息进入未启用分区的主题/队列时,将观察 FIFO 进行消息传递*。
当您在主题/队列上启用分区并且 SessionId 用于分区键时,不再保证消息之间是 FIFO ,它们仅保证相对于分区是 FIFO他们被分成。
有趣的事实是,如果同一订阅/队列的订阅者数量较少,则分区通常会产生一些有趣的副作用,因为分区读取器分配是循环方式完成的,并且如果您的分区多于订阅者,你可以看到消息匮乏(需要 SB 团队的验证,这是我自己做的测试的经验,因为我的消息匮乏)。
* 正如 @Dan Rosanova 上面指出的,如果你有异步处理或多个读取器,那么你的消息processing不能保证是 FIFO 的,但是消息分发到处理器的顺序将是先进先出。
当您使用会话消息处理程序(需要填充 SessionId)时,您将更进一步,并保证消息按顺序处理,因为会话消息处理程序会锁定SessionId+MessageId 而不仅仅是 MessageId,从而确保同一会话中的其他消息不会被另一个处理器接收。
如果只是需要按顺序检索消息,则不需要使用 会议。如果需要按顺序处理消息,请使用会话。