У меня есть новая долговечная функция, заменяющая длительную веб-задачу, она работает хорошо и быстрее, чем предыдущая, но у меня проблема с параллелизмом.
Я понимаю, что все действия относятся к центральному рабочему элементу Q, это означает, что элементы обрабатываются по порядку, проблема, с которой я столкнулся, заключается в том, что если есть 10 элементов в бэклоге от пользователя A, а пользователь B что-то отправляет, то пользователь B должен подождать пока все данные от пользователя А не закончат обработку.
С текущими веб-заданиями мы можем автоматизировать масштабирование, и новое веб-задание будет собирать данные для пользователя B и обрабатывать их параллельно с существующей обработкой.
Правильно ли я считаю, что единственный способ обойти это - опубликовать 2 копии моей функции, по одной для каждого пользователя / клиента, чтобы гарантировать, что на одного пользователя не влияет накопление данных другого пользователя?
Я попытался разбить вещи на рабочий элемент Q, чтобы ни одна задача не поместила больше, чем X элементов на Q, чтобы теоретически было некоторое совместное использование ресурса, но это просто замедляет работу, так как тогда на рабочем элементе Q их меньше, и поэтому Автоматическое масштабирование плана потребления увеличивается очень медленно из-за меньшего объема рабочего элемента Q.
ОБНОВЛЕНИЕ
Я должен был быть более ясным в отношении того, почему я вижу проблему, прибл. Процесс Durable Function выглядит следующим образом:
- Разбить файл на страницы
- Fan Out, указав действие на Q для каждой страницы
- Вентилятор в
- Разветвление: размещение другого действия на Q для каждой страницы (для запуска требуются данные из предыдущего разветвления)
- Вентилятор в
- Вставить информацию о страницах в БД за одну транзакцию
- Отметить файл как обработанный в БД
Таким образом, пользователь A загружает файл 1, содержащий 1000 страниц, затем пользователь B загружает файл со 100 страницами.
Хотя я ценю, что он обрабатывает действие Q параллельно, он по-прежнему выполняет действия по порядку (я предполагаю), поэтому, если в Q для файла пользователя A при запуске файла пользователя B есть 1000 элементов, тогда начальные 100-страничные действия получают включают активность Q после 1000 и, следовательно, "блокируются" ими. Тогда к тому времени, когда будут выполнены 100 действий на начальной странице, есть большая вероятность, что следующее разветвление для 1000-страничного документа добавит больше элементов в действие Q, снова блокируя продвижение 100-страничного документа.
Моя проблема заключается в том, что пользователь A и B могут быть двумя разными клиентами, которые не ожидают, что их работа будет заблокирована обработкой другого клиента, поэтому мой комментарий о наличии дублированных экземпляров функции Durable и посредничестве сообщений между несколькими экземплярами
В этом есть немного больше смысла?