Служебная шина Azure — удаление определенного сообщенияC#

Место общения программистов C#
Ответить
Anonymous
 Служебная шина Azure — удаление определенного сообщения

Сообщение Anonymous »

Я разрабатываю систему, которая будет включать в себя множество операций синхронизации данных, разбитых на небольшие задачи. Я добавляю каждую небольшую задачу как задание/сообщение в очередь служебной шины Azure.

У меня есть X рабочих ролей, затем я проверяю очереди и обрабатываю данные.

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

Самое замечательное в функциональности Azure заключается в том, что они выполняют за вас всю работу на стороне сервера, но недостатком является то, что иногда может быть сложно отлаживать данные или манипулировать ими.

Что я хочу, так это представить список сообщений в очереди (что я сделал с помощью PeekBatch) в веб-интерфейсе. Затем я хочу иметь возможность выбрать некоторые/все сообщения и удалить их.

Я могу сделать это, если в коде есть ошибка, и я хочу остановить остановку сообщений определенного типа.

После этого у меня также появится возможность повторно добавлять сообщения с веб-страницы. Возможно, я захочу увеличить количество своих рабочих ролей и сообщений, чтобы выполнить задачу быстрее (или замедлить их) или повторно добавить удаленные сообщения.

Итак, вопрос в том, как я могу выбрать конкретное сообщение из очереди, а затем удалить его? Насколько я вижу, очевидного способа сделать это не существует, и, если это возможно, потребуется какой-то обходной путь. Для меня это звучит немного странно.

Редактировать:

У меня есть кое-что, что работает, но на самом деле это не кажется отличным решением:

Код: Выделить всё

    public void DeleteMessages(List messageIds)
{
foreach (var msg in Client.ReceiveBatch(100))
{
if (messageIds.Contains(msg.SequenceNumber))
msg.Complete(); // Deletes the message
else
msg.Abandon(); // Puts it back in the queue
}
}
Это будет становиться все менее и менее эффективным по мере увеличения очереди, но, по крайней мере, оно останавливает все действия во время вызова удаления и удаляет указанные сообщения.

Он также удаляет только те сообщения, которые готовы к обработке. Сообщения в будущем будут игнорироваться, поэтому сейчас я добавил возможность добавлять сообщения «Сон», чтобы остановить обработку очереди до тех пор, пока мои сообщения не будут «готовы», и я смогу их удалить.

В Microsoft сообщили мне, что в настоящее время они работают над API для удаления определенных сообщений, которые должны быть доступны через несколько месяцев. А пока все дело в обходных путях.

Июньское обновление:

По-прежнему никаких обновлений от Microsoft по этой проблеме не было, и описанный выше метод был далеко не идеальным. Теперь я изменил свой код так, что:

Объект, который я помещаю в сообщение, имеет новое свойство:

Код: Выделить всё

Guid? MessageId { get; set; }
Обратите внимание, что Guid допускает значение NULL только для обеспечения обратной совместимости.

Когда я хочу удалить сообщение, я добавляю свой MessageId в таблицу базы данных «DeletedMessage».

Когда дело доходит до обработки сообщения, я ищу в таблице DeletedMessage соответствующий Guid, и если он его находит, я просто Complete() сообщение без выполнения обычной обработки.

Это работает хорошо, но требует небольших накладных расходов. Если вы не имеете дело с огромным количеством сообщений, это не большая проблема.

Также обратите внимание, что изначально я сделал это, используя SequenceNumber, но (как ни странно) SequenceNumber меняется между просмотром и получением сообщения! Это не позволит этой идее работать, если вы не используете свой собственный идентификатор, как указано выше.

Подробнее здесь: https://stackoverflow.com/questions/270 ... ic-message
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»