лучшие практики обработки подозрительных сообщений для темы служебной шины Azure

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

  1. Продолжает ли SequenceNumber сообщения, добавляемого служебной шиной Azure, увеличиваться при каждой неудачной попытке, пока не достигнет maxDeliveryCount?
  2. Установка maxDeliveryCount = 1 - это лучшая практика для работы с подозрительными сообщениями, чтобы потребитель никогда не пытался дважды обработать сообщение после сбоя.

person fortm    schedule 12.04.2020    source источник
comment
Привет, @Fortm, могут быть сценарии, в которых вам нужно следить за ошибочными сообщениями, которые поступают в вашу подписку на темы, и за сообщениями с мертвыми буквами из вашей подписки на темы. Одной из больших проблем может стать восстановление и повторная отправка этих сообщений. Тем не менее эту проблему можно решить с помощью таких инструментов, как Service Bus Explorer или Serverless360.   -  person Nadeem Duke    schedule 13.04.2020
comment
Проблема с повторной отправкой связана с тем, что повторно отправленное сообщение попадает в конец очереди и фактически меняет порядок?   -  person fortm    schedule 14.04.2020


Ответы (1)


Лучшие практики зависят от вашего приложения и вашего подхода к повторной попытке.

Большую часть времени я замечал, что сообщение не получилось

  1. Зависимая служба недоступна (Redis, проблема с подключением SQL)

  2. Сообщение о неисправности (сообщение не имеет обязательного параметра или некорректное значение)

  3. Проблема с кодом процесса (ошибка в коде обработки сообщений)

Для 1-го и 3-го сценариев я создал веб-задание C # для запуска и повторной обработки мертвого письма.

Ниже мой код

internal class Program
    {
        private static string connectionString = ConfigurationSettings.AppSettings["GroupAssetConnection"];
        private static string topicName = ConfigurationSettings.AppSettings["GroupAssetTopic"];
        private static string subscriptionName = ConfigurationSettings.AppSettings["GroupAssetSubscription"];
        private static string databaseEndPoint = ConfigurationSettings.AppSettings["DatabaseEndPoint"];
        private static string databaseKey = ConfigurationSettings.AppSettings["DatabaseKey"];
        private static string deadLetterQueuePath = "/$DeadLetterQueue";

        private static void Main(string[] args)
        {

            try
            {
                ReadDLQMessages(groupAssetSyncService, log);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                throw;
            }
            finally
            {
                documentClient.Dispose();
            }
            Console.WriteLine("All message read successfully from Deadletter queue");
            Console.ReadLine();
        }

        public static void ReadDLQMessages(IGroupAssetSyncService groupSyncService, ILog log)
        {
            int counter = 1;
            SubscriptionClient subscriptionClient = SubscriptionClient.CreateFromConnectionString(connectionString, topicName, subscriptionName + deadLetterQueuePath);
            while (true)
            {
                BrokeredMessage bmessgage = subscriptionClient.Receive(TimeSpan.FromMilliseconds(500));
                if (bmessgage != null)
                {
                    string message = new StreamReader(bmessgage.GetBody<Stream>(), Encoding.UTF8).ReadToEnd();
                    syncService.UpdateDataAsync(message).GetAwaiter().GetResult();
                    Console.WriteLine($"{counter} message Received");
                    counter++;
                    bmessgage.Complete();
                }
                else
                {
                    break;
                }
            }

            subscriptionClient.Close();
        }
    }

Для второго сценария мы вручную проверяем мертвые сообщения (исследование пользовательского интерфейса / служебной шины), иногда мы исправляем данные сообщения, а иногда мы очищаем сообщение и очищаем очередь.

Я не буду рекомендовать maxDeliveryCount=1. Если возникают какие-либо проблемы с сетью / подключением, встроенная повторная попытка обработает и удалит из очереди. Когда я работал в финансовом приложении, я держал maxDeliveryCount=5, в то время как в моем приложении IoT это maxDeliveryCount=3.

Если вы читаете сообщения в пакетном режиме, полный пакет будет повторно обработан, если произошла ошибка в любом из сообщений.

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

person Pankaj Rawat    schedule 12.04.2020