
С вами снова Илья Вязников, инженер сопровождения СОФРОС. Продолжаю делится практическими приёмами и полезными настройками платформы.
Когда в интеграционной платформе одновременно обрабатываются тысячи сообщений разных типов, стандартной FIFO-очереди часто бывает недостаточно. Критически важные сообщения должны обрабатываться в первую очередь, даже если система сильно загружена.
В этой статье разберём, как настроить гибкую систему приоритезации очередей в DATAREON Platform на основе типа данных и дополнительных свойств сообщения.
Задача
Нужно было обеспечить приоритетную обработку сообщений определённых типов, либо с определенными свойствами. Сообщения с высоким приоритетом должны проходить раньше остальных, а система при этом оставалась простой в поддержке и расширении.
Решение
DATAREON Platform позволяет создавать правила обработки очередей, в которых можно:
Распределять входящие сообщения по разным очередям
Извлекать сообщения для обработки в заданном порядке приоритетов.
Настройка
1. Создание очередей
Правила обработки создаются в Центре Настройки в разделе Обработка данных - Правила обработки очередей.
В правиле обработки очередей на вкладке «Основные» указываем название правила, и включаем его отметив тик-бокс.
Добавляем необходимые очереди, например:
Queue_HighPriority- Высокий приоритетQueue_NormalPriority- Обычный приоритетQueue_LowPriority- Низкий приоритет (по умолчанию)Queue_Property1Priority,Queue_Property2Priority- очереди по значению свойства

2. Правило размещения сообщений (Placement Rule)
На вкладке «Правило размещения» настраиваем логику распределения:
// Словарь для определения очереди по типу данных // Если сообщение содержит определенный тип данных, оно будет отправлено в соответствующую очередь OwnDictionary<Metadata.DataTypes, QueueState> DictionaryOfValidQueuesByType = new() { [Metadata.DataTypes.Тип_1_18235] = Queues.Queue_NormalPriority, [Metadata.DataTypes.Тип_2_18235] = Queues.Queue_HighPriority }; // Словарь для определения очереди по строковому свойству "stringProperty" // Если сообщение содержит определенное значение свойства, оно будет отправлено в соответствующую очередь OwnDictionary<string, QueueState> DictionaryOfValidQueuesByProperty = new() { ["Property_1"] = Queues.Queue_Property1Priority, ["Property_2"] = Queues.Queue_Property2Priority }; // Назначение приоритетных очередей // 1. Проверяем, есть ли соответствие типа данных в словаре DictionaryOfValidQueuesByType if (!DictionaryOfValidQueuesByType.TryGetValue(InitMessage.GetDataType(), out QueueState Queue_Local)) { // 2. Если нет, проверяем соответствие строкового свойства в словаре DictionaryOfValidQueuesByProperty If (!DictionaryOfValidQueuesByProperty.TryGetValue(InitMessage.GetStringProperty("stringProperty"), out Queue_Local)) { // 3. Если нет ни по типу данных, ни по строковому свойству – назначаем очередь по умолчанию (LowPriority) Queue_Local = Queues.Queue_LowPriority; // Очередь по умолчанию } } // Присваиваем выбранную очередь Queue = Queue_Local;
Как работать с этим кодом:
Добавление новых типов данных – если появится новый тип данных, который нужно направлять в определенную очередь, просто добавьте новую запись в DictionaryOfValidQueuesByType.
Добавление новых значений stringProperty – если появится новое значение stringProperty, которое должно попадать в конкретную очередь, добавьте его в DictionaryOfValidQueuesByProperty.
Если ни один параметр не совпадает – сообщение автоматически попадет в очередь Queue_LowPriority.
-
Логика приоритета:
В первую очередь проверяется соответствие по типу данных.
Если тип данных не определяет очередь – проверяется значение свойства stringProperty.
Если и это не дало результата – сообщение уходит в очередь по умолчанию.
3. Правило извлечения сообщений (Extraction Rule)
На вкладке «Правило извлечения» определяем порядок обработки:
// Формируем список очередей в порядке их приоритета (от высокой к низкой) var priorityQueues = new List<QueueState> { Queues.Queue_HighPriority, // Очередь с наивысшим приоритетом Queues.Queue_NormalPriority, // Очередь со средним приоритетом Queues.Queue_Property1Priority, // Очередь, связанная с Property_1 Queues.Queue_Property2Priority // Очередь, связанная с Property_2 }; // Находим первую непустую очередь или устанавливаем очередь по умолчанию Queue = priorityQueues.FirstOrDefault(q => q.Count > 0) ?? Queues.Queue_LowPriority;
Как работает код:
-
Определение приоритетных очередей
Очереди расположены в порядке приоритета – от самой важной (Queue_HighPriority) до менее значимых (Queue_Property2Priority).
Если появятся новые приоритетные очереди, их можно добавить в список priorityQueues в нужном порядке.
-
Поиск первой непустой очереди
Метод FirstOrDefault(q => q.Count > 0) ищет первую очередь, в которой есть сообщения.
Как только находит такую очередь, она выбирается для обработки.
-
Если все очереди пусты
Оператор ?? означает, что если FirstOrDefault() не нашел не пустую очередь (вернул null), используем Queue_LowPriority как очередь по умолчанию.
Как работать с этим кодом:
Если нужно изменить приоритет очередей, просто поменяйте порядок элементов в priorityQueues.
Если требуется добавить новую очередь, добавьте её в priorityQueues в нужное место (в зависимости от её приоритета).
Очередь Queue_LowPriority остается запасной, если все остальные очереди пусты.
4. Применение правила
Созданное правило обработки очередей указывается в настройках нужных внешних систем либо сервисов в поле Правило обработки очередей.

После применения конфигурации в Центре мониторинга появляются новые очереди, по которым можно отслеживать нагрузку и состояние:

Результат
После внедрения настройки сообщения будут обрабатываться в соответствии с настроенным приоритетом. Критически важные сообщения стабильно проходят раньше остальных, что позволит повысить предсказуемость и надёжность интеграционных процессов.
Преимущества подхода
Простота расширения - достаточно добавить новую запись в словарь.
Явный приоритет - порядок очередей в списке priorityQueues полностью определяет стратегию.
Универсальность - работает как по типу данных, произвольным свойствам сообщения, так и по источнику, обработчику не рассмотренным в примере.
Удобный мониторинг - каждая очередь видна в Центре мониторинга.
Заключение
Приоритезация очередей - мощный инструмент DATAREON Platform, который помогает решать задачи высоконагруженных интеграций. Подход, описанный выше, легко адаптировать под свои типы сообщений и бизнес-правила.
Подробнее с правилами обработки очередей вы можете ознакомиться в документации:
Настройка правил с помощью кода C#
Если у вас есть вопросы по реализации или нужны уточнения - пишите в комментариях.
Теги: DATAREON, Platform, очереди, приоритизация, message queue, интеграция, C#, middleware