Как решить пакетную обработку в ESB?
У нас есть устаревшая система, которая производит файлы, каждый из которых содержит сотни сообщений (финансовые транзакции). Нам нужно преобразовать эти сообщения в другой формат и отправить их (индивидуально) в целевую систему. Вопрос заключается в следующем: должен ли ESB принимать эти файлы для непосредственной обработки или должно существовать приложение-адаптер между устаревшей системой и ESB, которое разделит полученные файлы на отдельные сообщения и позволит ESB обрабатывать сообщения индивидуально (вместо обработки всего файла).)?
В первом решении мы ожидаем два потока ESB. Первый из них преобразует файл в новый формат, разделяет его на сообщения и сохраняет эти сообщения во временном местоположении. Преобразование должно обрабатывать файл в целом, поскольку файл содержит некоторые общие разделы, которые необходимы для преобразования отдельных сообщений. Второй поток будет принимать отдельные преобразованные сообщения (каждое в отдельной транзакции БД), передавать их целевой системе и ожидать его ответа (синхронно или асинхронно).
Второе решение заменяет первый поток внешним приложением, которое преобразует файл, разделяет его на отдельные преобразованные сообщения и сохраняет их во временном местоположении (локальная файловая система). Второй поток останется в ESB.
На наш взгляд, недостатком первого решения является то, что ESB должен обрабатывать огромные файлы (в первом потоке), что обычно считается антипаттерном. С другой стороны, ESB будет настраиваться непосредственно на интерфейс унаследованной системы, что является одной из целей ESB.
Во втором решении приложение-адаптер будет содержать логику преобразования, что должно стать еще одной из целей и обязанностей ESB.
Каково обычно предлагаемое решение для этой ситуации (образец)? Не могли бы вы предоставить некоторые ссылки, которые являются более описательными, чем эти две ссылки, которые я нашел?
https://www.ibm.com/developerworks/wikis/display/esbpatterns/File+Processing
Изменить другую ссылку: http://www.ibm.com/developerworks/webservices/library/ws-largemessaging/
2 ответа
Вы можете использовать ESB для первого случая, и я не думаю, что это будет анти-паттерн. Цель ESB также заключается в интеграции устаревших приложений, которые создают файлы в качестве вывода, как в вашем случае использования, с другими приложениями.
Вы можете попробовать Mule ESB. Это позволит вам использовать файл с помощью потоковой передачи (через транспорт файлов), сопоставить содержимое файла с желаемым выводом с помощью графического интерфейса пользователя DataMapper и, наконец, поместить эти сообщения в очередь виртуальных машин, которая может быть постоянной очередью в ESB., Эти очереди являются транзакционными, поэтому вы можете гарантировать, что все сообщения, созданные из одного файла, были помещены в очередь виртуальных машин или ни одно из них. Затем вы можете из другого потока (фактически обработанные в ESB, называются потоками в муле), прочитать каждое из этих сообщений и обработать их.
HTH, Пабло.
Помните, что в SOA существует 3 типа сообщений: команда, событие, документ
Этот бит "Документ" предназначен для порций данных. Вероятно, он лучше подходит для "настоящих" типов документов, таких как "Заказ" или "Счет-фактура" и т. П., Но ничто не мешает вам использовать "TransactionBatch".
Тем не менее, это довольно неиспользуемый тип сообщений, поскольку не так много сервисных шин реализуют что-либо вокруг него, поскольку:
- тебе это не нужно
- многие технологии очереди сообщений имеют ограничения по размеру сообщения (до 4 КБ), что затрудняет транспортировку любого большого сообщения (необходимо отправлять кусками)
Так что я бы сделал в вашем сценарии конечную точку, которая обрабатывает файл. Так что-то вроде ProcessTransactionFileCommand
отправляется на конечную точку обработки, и в ней у вас есть только ссылка на фактический файл (хранящийся где-то в файловой системе или даже URL-адрес для загрузки). Эта конечная точка обработки может обрабатывать файл и отправлять отдельные сообщения (все в пределах транзакции) конечной точке интеграции, которая отправляет сообщение во внешнюю систему. Вы могли бы иметь SendTransactionCommand
сделать это.
Таким образом, ваша система очень гибкая в том смысле, что конечная точка интеграции может получать отдельные команды интеграции из некоторых частей вашего решения, в то время как конечная точка обработки может обрабатывать пакет и разбивать их на отдельные команды интеграции.
Если вы находитесь в.NET пространстве, вы можете посмотреть на мой проект FOSS Service Bus: http://shuttle.codeplex.com/
Но любой сервисный автобус справится (MassTransit, NServiceBus и т. Д.)