Часть приложения, над которым я работаю, включает в себя загрузку электронных писем, содержащих вложения, обнаружение штрих-кода в каждом вложении, сканирование его на наличие идентификатора и использование идентификатора для вставки данных в базу данных.
До сих пор мое использование шин сообщений ограничивалось Pub/Sub, и у меня никогда не было необходимости использовать Sagas. Однако, учитывая, что каждый из вышеперечисленных шагов является частью одного и того же связанного процесса, и нам нужна надежность в случае сбоя какой-либо части процесса, подходит ли Saga?
Детали нашего процесса и то, как я думал использовать сагу, следующие:
- Задание Quartz используется для загрузки электронных писем, содержащих вложения в формате PDF. Задание Quartz использует файл
Connector
, содержащий информацию о файлеTenant
. Эта информация об арендаторе потребуется Saga, чтобы мы могли взаимодействовать с конкретными ресурсами арендатора (база данных/хранилище). - Для каждого вложения PDF мы запускаем сагу «Обработка документа», передавая ему информацию об арендаторе и сам документ (при условии, что шина сообщений может сохранять это) или путь к файлу на диске. После запуска Saga для каждого вложения исходного сообщения электронной почты соединитель может удалить или заархивировать сообщение электронной почты из почтового ящика, чтобы оно больше не обрабатывалось.
Затем каждая сага будет выполнять следующие задачи:
- Попытка считать штрих-код из вложения/файла. Если обнаружение штрих-кода не удастся, нам нужно будет загрузить файл в указанное место, чтобы его можно было обработать вручную. Это завершит сагу. Если штрих-код был обнаружен, мы расшифровываем идентификатор базы данных.
- Using the identifier we load the relevant
Order
record from our database and if it exists:- Upload the file to a specified location returning the URI
- Вставьте новую запись
OrderDocument
в нашу базу данных, которая ссылается на URI файла.
- Мы обновляем
OrderDocumentBundle
, который представляет собой единый файл, содержащий все документы, связанные с заказом. Поэтому, когда создается новыйOrderDocument
, мы должны загрузитьOrderDocumentBundle
для связанногоOrder
и добавить страницы из новогоOrderDocument
. - Сага завершена.
Меня беспокоят проблемы параллелизма во время окончательного процесса объединения, поскольку у нас может быть несколько сообщений, пытающихся обновить пакет. Нам нужно убедиться, что Saga ждет, пока файл пакета станет доступным, чтобы он завершился.