Гарантирует ли свойство 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 для того же
Да, вы можете выполнить проверку, чтобы определить, было ли сообщение успешно добавлено в очередь или нет.
При построении CloudMessage var message = new CloudQueueMessage(payload);
все остальные свойства, кроме AsString и AsBytes, будут нулевыми. Таким образом, вы можете использовать такие свойства, как "Id" или "PopReceipt", которые заполняются при успешном добавлении сообщения в очередь для выполнения проверки.
Также убедитесь, что ваша функция Azure запускается 200 раз в 5 минут, как вы упоминали, если ваша функция не запускается при получении сообщения, то проблема связана с функцией Azure.