Я ищу некоторые рекомендации по реализации следующего шаблона с использованием (микро) сервисов и служебной шины. В этом конкретном случае службы Service Fabric и экземпляр сервисной шины Azure, но с точки зрения шаблона, которые могут даже не иметь такого значения.
Представьте сценарий, в котором мы получаем рабочий пакет с несколькими файлами в нем. Для обработки мы хотим, чтобы каждый отдельный файл обрабатывался параллельно, чтобы мы могли легко масштабировать эту операцию на несколько сервисов. После завершения всей обработки мы можем продолжить наш бизнес-процесс.
Так что это фан-аут, затем фан-сбор, чтобы собрать все результаты и продолжить. Например, ради, скажем, у нас есть ZIP-файл, разархивируйте файл и обработайте каждый файл, и как только все будет сделано, мы можем продолжить.
Разветвитель легко. Разархивируйте файл, чтобы n файлов разместили n сообщений в очереди служебной шины и имели несколько служб, обрабатывающих их параллельно. Но теперь, как мы узнаем, что все эти службы завершили свою работу?
Ряд вариантов, которые я рассматриваю:
- Помимо отправки сообщения служебной шины для каждого файла, мы также сохраняем файлы в виде сортировки вместе с именемисходного ZIP-файла. Как только работник завершит обработку, он снова удалит этот файл из таблицы и проверит, был ли он последним. Когда это было, мы можем опубликовать сообщение, чтобы указать, что весь ZIP был теперь обработан.
- Аналогично 1., но вместо этого у нас есть рабочий ответ, что это сделано, и служба обработки ZIP проверит, осталась ли какая-либо работа. Немного чище, так как теперь ответственность за эту таблицу лежит на службе обработки ZIP.
- Пусть служба обработки ZIP активно ожидает всех ответных сообщений в отдельных потоках, но только ввод этой команды уже немного ранит мою голову.
- Представьте специальную службу оркестратора, которая принимает n сообщений и заботится о схеме разветвления / разветвления. Для этого также потребуется решение 2, но теперь оно расположено в отдельном сервисе, поэтому у нас нет никакой логики (+ хранилище) в самом сервисе обработки ZIP.
Я изучил, как сервисная шина уже может иметь какую-либо функцию для поддержки этого шаблона, но не смог найти ничего подходящего. Кажется, что долговременные функции поддерживают подобный сценарий, но мы не используем функции в этом проекте, и я бы предпочел не начинать делать это просто для реализации этого шаблона.
Мы, конечно, не первые, кто реализовал такую вещь, поэтому я действительно надеялся, что смогу найти какой-то реальный совет относительно того, что работает и чего следует избегать любой ценой.