Azure 服务总线 - 留言

Posted

技术标签:

【中文标题】Azure 服务总线 - 留言【英文标题】:Azure Service Bus - Leave message 【发布时间】:2021-12-30 11:22:24 【问题描述】:

(仅供参考 - 我是新的 ASB)

关于 Azure 服务总线的几个问题:

    您如何从队列中获取消息但将其留在那里直到其 TTL 过期?我原以为只是不调用 CompleteMessageAsync 就可以做到这一点,但无论如何它似乎都会被删除。

    如何从队列中获取消息,但只有在特定接收者收到时才出队(删除)?

Message.ApplicationProperties["ReceiverId"].ToString() == "123" // 现在你可以删除它了

谢谢

【问题讨论】:

【参考方案1】:

如何从队列中获取消息但将其保留在那里直到其 TTL 过期?

您可以查看消息而不是接收消息。问题是邮件将一次又一次地被拾取,直到传递计数超过最大值并且邮件将死信,这是您不希望发生的。我会回顾一下你在这里想要实现的目标,因为它是一个矛盾的设置。您希望消息有一个 TTL 以防止它被拾取,但是您希望在 TTL 继续过期之前对其进行探测。

如何从队列中获取消息,但只有在特定接收者收到时才出队(删除)?

我的建议是不要为此使用队列。如果您以特定目的地为目标,请使用您的实体拓扑来表达它。例如:发布关于某个主题的消息,并根据订阅者标识进行不同的订阅。这样您就可以为特定订阅者提供消息,其中逻辑订阅者可以横向扩展。

【讨论】:

【参考方案2】:

1-使用 PeekMessage:

您可以查看队列中的消息,而无需将它们从队列中删除 通过调用 PeekMessages 方法来处理队列。如果你没有通过 maxMessages 参数的值,默认是偷看一个 消息。

//-------------------------------------------------
// Peek at a message in the queue
//-------------------------------------------------
public void PeekMessage(string queueName)

    // Get the connection string from app settings
    string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

    // Instantiate a QueueClient which will be used to manipulate the queue
    QueueClient queueClient = new QueueClient(connectionString, queueName);

    if (queueClient.Exists())
     
        // Peek at the next message
        PeekedMessage[] peekedMessage = queueClient.PeekMessages();

        // Display the message
        Console.WriteLine($"Peeked message: 'peekedMessage[0].Body'");
    

https://docs.microsoft.com/en-us/azure/storage/queues/storage-dotnet-how-to-use-queues?tabs=dotnet

2-你也可以使用PeekMessage,检查你想要的属性(ReceiverId),如果是正确的,只需完成消息:

// ServiceBusReceiver 
await receiver.CompleteMessageAsync(receivedMessage);

【讨论】:

以上是关于Azure 服务总线 - 留言的主要内容,如果未能解决你的问题,请参考以下文章

服务总线触发 Azure 函数

Azure 服务总线消息生存时间设置 [关闭]

Azure 服务总线队列性能

Nestjs 上的 Azure 服务总线侦听器

Azure 服务总线有序处理消息

集成 Azure 服务总线主题和 Azure 函数