Как получить указанное сообщение из темы Azure Service Bus, а затем удалить его из темы? - PullRequest
0 голосов
/ 07 июня 2019

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

   static async Task ProcessMessagesAsync(Message message, CancellationToken token)
    {
        // Process the message.
        Console.WriteLine($"Received message: WorkOrderNumber:{message.MessageId} SequenceNumber:{message.SystemProperties.SequenceNumber} Body:{Encoding.UTF8.GetString(message.Body)}");
        Console.WriteLine("Enter the WorkOrder Number you want to delete:");
        string WorkOrderNubmer = Console.ReadLine();
        if (message.MessageId == WorkOrderNubmer)
        {
            //TODO:Post message into other topic(Priority) then delete from this current topic.
            var status=await SendMessageToBus(message);
            if (status == true)
            {
                await normalSubscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
                Console.WriteLine($"Successfully deleted your message from Topic:{NormalTopicName}-WorkOrderNumber:" + message.MessageId);
            }
            else
            {
                Console.WriteLine($"Failed to send message to PriorityTopic:{PriorityTopicName}-WorkOrderNumber:" + message.MessageId);
            }

        }
        else
        {
            Console.WriteLine($"Failed to delete your message from Topic:{NormalTopicName}-WorkOrderNumber:" + WorkOrderNubmer);
            // Complete the message so that it is not received again.
            // This can be done only if the subscriptionClient is created in ReceiveMode.PeekLock mode (which is the default).
            await normalSubscriptionClient.CompleteAsync(message.SystemProperties.LockToken);

            // Note: Use the cancellationToken passed as necessary to determine if the subscriptionClient has already been closed.
            // If subscriptionClient has already been closed, you can choose to not call CompleteAsync() or AbandonAsync() etc.
            // to avoid unnecessary exceptions.
        }

    }

Моя проблема с этим подходом:

  1. Не масштабируется; Что делать, если сообщение является 50-м в коллекции? Нам нужно будет повторить 49 раз и пометить, то есть удалить.

  2. Это длительный процесс.

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

Итак, кто-нибудь может подсказать мне, как решить эту проблему?

1 Ответ

0 голосов
/ 17 июня 2019

Поэтому, если я правильно понимаю ваши вопросы и комментарии, вы пытаетесь сделать что-то вроде этого:

  1. Входящие сообщения входят либо в стандартную, либо в приоритетную тему.
  2. Некоторые процессы проверяют сообщения в стандартной теме и «перемещают» их в приоритетную тему на основе некоторых критериев, удаляя их из стандартной темы и добавляя их в приоритетную тему.
  3. Сообщенияобрабатывается как обычно.

enter image description here

Как отметил Шон, шаг 2 просто не будет работать.Служебная шина - это система «первым пришел - первым вышел», где потребитель просто получает следующее доступное сообщение.Вы можете отсортировать очередь, извлекая все сообщения и оставляя / заполняя их на основе определенных критериев, но проблема заключается в масштабировании.Кроме того, вы можете думать о каждой подписке на тему как о своей отдельной очереди - удаление формы сообщения из одной подписки не удаляет ее из других подписок.

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

Вот как этот процесс будет работать:

  1. Входящие сообщения добавляются в очередь сортировки. Обратите внимание, что это отдельная очередь, а не тема.На этом этапе процесса мы хотим убедиться, что имеется только одна копия каждого сообщения.
  2. Процесс сортировки перемещает сообщения из очереди сортировки в стандартную или приоритетную очередь, в зависимости от ситуации.Используя что-то вроде функций Azure, вы можете довольно легко масштабировать этот процесс.
  3. Сообщения обрабатываются из тем в обычном режиме.

enter image description here

...