Обработка документов - случай для саги?

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

До сих пор мое использование шин сообщений ограничивалось Pub/Sub, и у меня никогда не было необходимости использовать Sagas. Однако, учитывая, что каждый из вышеперечисленных шагов является частью одного и того же связанного процесса, и нам нужна надежность в случае сбоя какой-либо части процесса, подходит ли Saga?

Детали нашего процесса и то, как я думал использовать сагу, следующие:

  1. Задание Quartz используется для загрузки электронных писем, содержащих вложения в формате PDF. Задание Quartz использует файл Connector, содержащий информацию о файле Tenant. Эта информация об арендаторе потребуется Saga, чтобы мы могли взаимодействовать с конкретными ресурсами арендатора (база данных/хранилище).
  2. Для каждого вложения PDF мы запускаем сагу «Обработка документа», передавая ему информацию об арендаторе и сам документ (при условии, что шина сообщений может сохранять это) или путь к файлу на диске. После запуска Saga для каждого вложения исходного сообщения электронной почты соединитель может удалить или заархивировать сообщение электронной почты из почтового ящика, чтобы оно больше не обрабатывалось.

Затем каждая сага будет выполнять следующие задачи:

  1. Попытка считать штрих-код из вложения/файла. Если обнаружение штрих-кода не удастся, нам нужно будет загрузить файл в указанное место, чтобы его можно было обработать вручную. Это завершит сагу. Если штрих-код был обнаружен, мы расшифровываем идентификатор базы данных.
  2. Using the identifier we load the relevant Order record from our database and if it exists:
    1. Upload the file to a specified location returning the URI
    2. Вставьте новую запись OrderDocument в нашу базу данных, которая ссылается на URI файла.
  3. Мы обновляем OrderDocumentBundle, который представляет собой единый файл, содержащий все документы, связанные с заказом. Поэтому, когда создается новый OrderDocument, мы должны загрузить OrderDocumentBundle для связанного Order и добавить страницы из нового OrderDocument.
  4. Сага завершена.

Меня беспокоят проблемы параллелизма во время окончательного процесса объединения, поскольку у нас может быть несколько сообщений, пытающихся обновить пакет. Нам нужно убедиться, что Saga ждет, пока файл пакета станет доступным, чтобы он завершился.


person Ben Foster    schedule 24.05.2013    source источник
comment
Какой вопрос? Сага хороший выбор не является конструктивным.   -  person JJJ    schedule 24.05.2013
comment
Я объяснил наш процесс. Я хотел бы знать, является ли Saga лучшим подходом для этого.   -  person Ben Foster    schedule 24.05.2013
comment
Если вы просто используете простое планирование заданий, возможно, вы даже не используете Quartz, если решите использовать сагу NServiceBus, но просто сделайте себе одолжение, используя сагу, никогда не публикуйте события из нее.   -  person MeTitus    schedule 27.05.2013


Ответы (1)


Отказ от ответственности: когда мы говорим о сагах, мы говорим о сагах NServiceBus, я надеюсь, что не начнется религиозная дискуссия. :)

Вы должны определить две или три саги. Один для электронной почты, а другой для вложения.

  • EmailSaga будет знать, сколько есть вложений, и не завершится, пока каждая AttachmentSaga не вернет ответ.
  • Каждая AttachmentSaga может начинаться с вызова обработчика (RetrieveBarCodeHandler) для извлечения штрих-кода. Если этот обработчик дает сбой, он также отвечает, но со статусом сбоя.
  • The AttachmentSaga can call another saga (ManualProcessingSaga) to store the attachment and email a user (or something like it & it can call other handlers) to manually process the barcode.
    • The user manually processes the attachment and submits the result with a command (RegisterBarcodeCommand)
    • ManualProcessingSaga получает команду и отправляет ответ инициатору, AttachmentSaga.
    • AttachmentSaga может продолжить свою работу и, наконец, отправляет ответ на EmailSaga.
  • У EmailSaga есть все ответы, и он знает, что это сделано.

Почему так много саг? Потому что

  1. Работа с электронной почтой — длительный процесс
  2. Обработка вложения — длительный процесс
  3. Ручная обработка вложения — длительный процесс.

Длительный процесс не из-за времени, а из-за того, что происходит несколько вещей, или он ожидает ответов или тайм-аута.

Конечно, не забудьте включить что-то, связанное с тайм-аутами. Если AttachmentSaga не отвечает в течение определенного времени, уведомите пользователя или что-то в этом роде.

person Dennis van der Stelt    schedule 24.05.2013
comment
Спасибо, это было очень полезно. - person Ben Foster; 24.05.2013
comment
Я собирался начать религиозную дискуссию, когда увидел название саги, но, к счастью, вовремя увидел саги о NServiceBus. - person MeTitus; 27.05.2013
comment
Способ определения процесса - не лучший IMO, потому что вы позволяете своим сагам отвечать на другие саги, но опять же, вы говорите о сагах NServiceBus, которые позволяют вам делать именно это. - person MeTitus; 27.05.2013
comment
Изучив это более подробно, я не уверен, что вижу преимущество наличия родителя Email по сравнению с простым запуском новой саги для каждого для вложения. - person Ben Foster; 27.05.2013
comment
Не уверен, что понимаю, что вы имеете в виду. Я хочу, напишите мне. Мой блог (и страницу контактов) можно найти в моем профиле. - person Dennis van der Stelt; 28.05.2013