Гарантирует ли свойство PopReceipt, что CloudQueueMessage был успешно добавлен в очередь хранения Azure?

Я использую библиотеку Microsoft.WindowsAzure.Storage.Queue для отправки сообщений в очередь хранения из функции Azure со следующим кодом:

public void Enqueue(MyMessage myMessage)
{
    string originalPayload = null;
    try
    {
          payload = serializer.Serialize(myMessage);
          var message = new CloudQueueMessage(payload);
          cloudQueue.AddMessage(message);
    }
    catch (Exception ex)
            {
                throw ex;
            }

}

Это работает для небольших томов, но при обработке около 200 сообщений в 5 минут почти половина сообщений не попадает в очередь, даже если функция никогда не завершается сбоем и отображается как успешная для всех попыток.

Поэтому я хочу добавить шаг проверки после нажатия на сообщение, и я подумал, будет ли работать только проверка PopReceipt:

if ( string.IsNullOrWhitespace(message.PopReceipt) )
{
    // the message was not added, do something
}

2 ответа

Решение

Функциональность получения квитанций для службы очереди - отличный инструмент для разработчиков, позволяющий легко идентифицировать помещенное в очередь сообщение для дальнейшей обработки. До версии "2016-05-31" всплывающее значение квитанции можно было получить только тогда, когда пользователь получает сообщение из очереди. Чтобы упростить это, теперь введите значение квитанции, доступное в ответе "Поместить сообщение" (он же "Добавить сообщение"), который позволяет пользователям обновлять / удалять сообщение без необходимости сначала извлекать сообщение.

Ниже приведен фрагмент кода, который использует эту новую функцию с помощью клиентской библиотеки хранилища Azure 8.0 для.NET.

// create initial message
CloudQueueMessage message = new CloudQueueMessage("");


queue.AddMessage(message, null, TimeSpan.FromSeconds(180));
//message.PopReceipt is now populated, and only this client can operate on the message until visibility timeout expires
.
.
.
// update the message (now no need to receive the message first, since we already have a PopReceipt for the message)
message.SetMessageContent("");
queue.UpdateMessage(message, TimeSpan.FromSeconds(180), MessageUpdateFields.Content | MessageUpdateFields.Visibility);

// remove the message using the PopReceipt before any other process sees it
await queue.DeleteMessageAsync(message.Id, message.PopReceipt);

Вот репозиторий GitHub для того же

https://github.com/Azure-Samples/storage-queue-dotnet-pop-receipt/blob/master/dotnet/storage-queue-dotnet-popreceipt/Program.cs

Да, вы можете выполнить проверку, чтобы определить, было ли сообщение успешно добавлено в очередь или нет.

При построении CloudMessage var message = new CloudQueueMessage(payload); все остальные свойства, кроме AsString и AsBytes, будут нулевыми. Таким образом, вы можете использовать такие свойства, как "Id" или "PopReceipt", которые заполняются при успешном добавлении сообщения в очередь для выполнения проверки.

Также убедитесь, что ваша функция Azure запускается 200 раз в 5 минут, как вы упоминали, если ваша функция не запускается при получении сообщения, то проблема связана с функцией Azure.

Другие вопросы по тегам