【问题标题】:Does Peek() method in PeekLock mode lock a Service bus message?PeekLock 模式下的 Peek() 方法是否会锁定服务总线消息?
【发布时间】:2021-02-05 14:56:25
【问题描述】:

我知道我们可以在 PeekLock 模式下使用 Receive() 方法来锁定消息,处理它,最后完成它。但是,Peek() 方法如何在 PeekLock 模式下工作?它会锁定消息吗?

var client = messagingFactory.CreateQueueClient("entity", ReceiveMode.PeekLock);
BrokeredMessage = client.Peek();

另外,作为第二个问题,我知道我们可以重复调用 Peek() 来查看所有活动结束消息。但是,可以重复使用 Peek() 方法来查看所有死信消息吗?

【问题讨论】:

    标签: c# azure azureservicebus azure-servicebus-queues


    【解决方案1】:

    但是,Peek() 方法如何在 PeekLock 模式下工作?它会锁定消息吗?

    不,Peek() 不会锁定消息,无论模式如何。模式仅适用于Receive()。不仅Peek() 甚至可以返回被另一个接收者锁定的消息。

    但是,可以重复使用 Peek() 方法来查看所有死信消息吗?

    是的,死信消息位于另一个特殊队列中。您可以像普通队列一样从中Peek()

    另外为了提高吞吐量,您可以使用PeekBatch 代替Peek

    总之,Peek 是用于消息浏览/诊断目的的 API。您可能想快速阅读一下official documentation

    注意:对非分区实体的 peek 操作总是返回最旧的消息,但不在分区实体上。相反,它会返回消息代理首先响应的分区中最旧的消息。无法保证返回的消息是所有分区中最旧的消息。

    【讨论】:

    • 非常感谢@krishg!从您对我的第二个问题的回答来看,调用 Peek() 会重复查看分区队列中的所有消息吗?我知道 QueueClient 跟踪最后偷看的序列号,因此它为传统队列提供了唯一的消息。但是分区队列呢?在第一次 Peek() 调用期间,任何消息代理都可以响应并发送其消息。那么,如何实现 Peeking 分区队列的所有消息呢?
    • 即使对于分区队列,您的侦听器/接收器也会检查所有片段中的消息。因此,解决方案是相同的,您可以通过重复调用 Peek() 来浏览消息。你可以做一个快速测试来证明这一点。
    • 是的,它在几次测试中都有效。但根据文档,任何消息代理都可以先响应。因此,如果响应的消息代理的消息的序列号高于其他消息代理中的少数其他消息,那么那些序列号小于我们刚刚偷看的消息将永远不会被考虑。这也可以是一个案例吗?因为客户端跟踪上次查看的序列号,然后它会查看比以前更大的序列号。虽然我从来没有涵盖过这个测试用例,但这是基于我的理论理解。
    • 您能指出您所指的文档吗?由于接收器将循环遍历所有片段,我认为它会独立地从所有分区中窥视。而且,对于 Peek(),它不关心任何其他竞争的听众。此外,为了提高吞吐量,您可以使用“PeekBatch”而不是“Peek”。
    • 这是文档。 docs.microsoft.com/en-us/azure/service-bus-messaging/… 这里它说“对非分区实体的 peek 操作总是返回最旧的消息,但不在分区实体上。相反,它返回消息代理首先响应的分区之一中最旧的消息。没有保证返回的消息是所有分区中最旧的消息。”如果它不是所有分区中最旧的,则 Peek() 无法接收较旧的消息,因为 Peek() 在浏览时从较低的序列号向较高的序列号工作。
    【解决方案2】:

    Peek 不锁定消息。事实上,Peek 甚至不知道关于锁的任何细节。文档是这样说的:

    Peek 还会返回已锁定且当前正在由其他接收者处理的消息。但是,由于 Peek 返回断开连接的快照,因此无法在 peeked 消息上观察到消息的锁定状态。

    您可以通过访问消息的锁定属性来检查这一点,例如LockedUntilUtc。这将返回一个异常InvalidOperationException

    第二个问题的答案是“是”。您可以浏览活动消息和死信消息。

    【讨论】:

      猜你喜欢
      • 2017-09-07
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 2023-03-25
      • 1970-01-01
      • 2022-10-08
      相关资源
      最近更新 更多