Приложение логики Azure - триггер служебной шины срабатывает только при повторении опроса

У меня есть пространство имен служебной шины Azure, содержащее 8 тем, каждая с хотя бы одной подпиской.

Обычно существует два приложения логики: первое извлекает данные из нашей базы данных каждые полчаса (в 15 и 45 часов) и помещает их в выбранную тему служебной шины, а второе запускается с помощью параметра Когда сообщение получено в коннектор триггера подписки (автозаполнения) темы - с установленным параллелизмом по умолчанию (25). Пример показан ниже

"When_a_message_is_received_in_a_topic_subscription_(auto-complete)": {
            "conditions": [],
            "inputs": {
                "host": {
                    "connection": {
                        "name": "@parameters('$connections')['servicebus']['connectionId']"
                    }
                },
                "method": "get",
                "path": "/@{encodeURIComponent(encodeURIComponent('exampletopic'))}/subscriptions/@{encodeURIComponent('examplesubscription')}/messages/head",
                "queries": {
                    "subscriptionType": "Main"
                }
            },
            "recurrence": {
                "frequency": "Minute",
                "interval": 30,
                "startTime": "2021-01-27T00:00:00.000Z",
                "timeZone": "UTC"
            },
            "runtimeConfiguration": {
                "concurrency": {
                    "runs": 25
                }
            },
            "type": "ApiConnection"
        }

Как упоминалось в заголовке, у меня возникла проблема, заключающаяся в том, что триггер срабатывает только при 30-минутном повторении опроса, как показано ниже, а не тогда, когда сообщения попадают в служебную шину (в отличие от триггера службы общих данных, который мы также используем который срабатывает при создании / обновлении / удалении мгновенно). Это сделано намеренно или я неправильно настроил?

Запуск приложений логики - триггер служебной шины

Другая проблема заключается в том, что настройка параллелизма буквально пропускает только 25, а остальное сохраняет в служебной шине до следующего запуска, поэтому нам приходится ждать длительные периоды между обработками. Я думал, что смысл настройки параллелизма состоит в том, чтобы позволить запуску приложения логики ждать в очереди, а затем, когда одно завершает работу, другое может запускаться. Как вы можете видеть на изображении, которое я вставил выше, этого просто не происходит. В ходе выполнения 3.45 из базы данных было извлечено 43 записи. Только 25 из них сработали в 4.00, а 17 остались на служебной шине до следующего запуска в 4.30. Это может стать огромным узким местом, если мы отправим через них огромные числа.

Ниже приведены настройки служебной шины, если они кому-то интересны:

Topic:
"properties": {
            "defaultMessageTimeToLive": "P5D",
            "maxSizeInMegabytes": 1024,
            "requiresDuplicateDetection": true,
            "duplicateDetectionHistoryTimeWindow": "PT1H",
            "enableBatchedOperations": true,
            "status": "Active",
            "supportOrdering": true,
            "autoDeleteOnIdle": "P10675199DT2H48M5.4775807S",
            "enablePartitioning": false,
            "enableExpress": false
        }
Subscription:
"properties": {
            "lockDuration": "PT5M",
            "requiresSession": false,
            "defaultMessageTimeToLive": "P5D",
            "deadLetteringOnMessageExpiration": true,
            "deadLetteringOnFilterEvaluationExceptions": true,
            "maxDeliveryCount": 1,
            "status": "Active",
            "enableBatchedOperations": true,
            "autoDeleteOnIdle": "P5D"
        }

заранее спасибо




Ответы (2)


Это намеренно или я неправильно настроил?

Триггер Service Bus разработан таким образом, потому что это polling trigger и будет запускаться в указанном вами interval, см. Обзор триггеров:

Каждый рабочий процесс включает в себя триггер, который определяет вызовы, которые создают и запускают рабочий процесс. Вот общие категории триггеров:

  • Триггер опроса, который через регулярные промежутки времени проверяет конечную точку службы.
  • Push-триггер, который создает подписку на конечную точку и предоставляет URL-адрес обратного вызова, чтобы конечная точка могла уведомить триггер, когда происходит указанное событие или доступны данные. Затем триггер ожидает ответа от конечной точки перед срабатыванием.

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

Вы пробовали выключить Concurrency Control. Согласно описанию, отключение Concurrency Control может запускать столько параллельных экземпляров, сколько возможно, но после включения настройки Concurrency Control его нельзя отключить. Возможно, вам придется воссоздать Azure logic app или установить Concurrency Control на максимально возможное значение, максимальное значение - 50.

1.

введите описание изображения здесь

2.

введите описание изображения здесь

person Frank Gong    schedule 10.02.2021
comment
Спасибо, Фрэнк. Я подозревал, что это могло быть так, потому что это всего лишь триггер опроса, но не смог найти документацию, подтверждающую его, спасибо за разъяснение. Что касается триггеров параллелизма, к сожалению, поскольку рассматриваемое приложение логики использует в нем довольно много общих действий службы данных и не имеет функции выборки xml, которую имеют братья Power Automate и Power Apps, это означает, что нам нужно гораздо больше запросов, чем хотелось бы, и достигают большего количества ограничений скорости, чем хотелось бы, отсюда и низкие ограничения параллелизма. Пробовали 50, не очень понравилось ... - person C Brindle; 11.02.2021

Приложение Logic работает с механизмом опроса, поэтому, как упоминает Фрэнк, одним из вариантов является сокращение времени интервала опроса. Но каждый опрос считается действием, поэтому стоимость приложений логики будет расти. Так что имейте это в виду. Вы можете увеличить параллелизм, чтобы получать больше сообщений из служебной шины.

Другой вариант, который вам стоит рассмотреть, - использовать Функции Azure с триггером служебной шины. Это будет мгновенный триггер, но да, это связано с кодированием, а не с настройкой.

person Anupam Chand    schedule 10.02.2021
comment
Спасибо за ответ. Причина, по которой мы изначально не пошли по маршруту функционального приложения, заключалась в том, что нам требовалось использовать общий API службы данных (теперь DataVerse) из-за того, что это интеграция с Dynamics, и в то время у команды не было набора навыков в отношении сделать так. - person C Brindle; 11.02.2021