Разработка процесса - PullRequest
       7

Разработка процесса

0 голосов
/ 21 января 2009

Я бросаю вам вызов:)

У меня есть процесс, который кто-то уже реализовал. Я попытаюсь описать требования, и я надеялся, что смогу получить какой-то вклад в «лучший способ» сделать это.

<ч />

Это для финансового учреждения.

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

Факты

  • Через фреймворк получаю файл.
  • Каждая строка в этом файле соответствует формату фиксированной длины с указанием лица и суммы (+ много других материалов).
  • Этот файл в 99% случаев находится ниже 100 МБ (около 800 байт на строку, т.е. 2,2 МБ = 2600 строк)
  • Один раз в год вместо этого у нас есть 1-3 ГБ данных.
  • Запуск на "appserver"
  • Я могу форковать подпроцессы так, как мне нравится. (в пределах разумного)
  • Не могу обеспечить согласованность при работе более двух дней. подпроцессы могут прекратиться, соединение с базой данных / платформой может быть потеряно, файлы могут переместиться
  • Я не могу отправлять надежные сообщения через фреймворк. Звонок синхронный, поэтому я должен дождаться ответа.
    • Возможно / вероятно, что отправка этих запросов getPerson приведет к сбою моего "процесса" при отправке LOTS.
  • Мы используем Java.


Требования

  • Я должен вернуть файл со всеми данными + Я должен добавить дополнительную информацию для некоторых строк. (около 25-50% строк: не менее 25.000)
  • Эту информацию я могу получить, только выполнив запрос getPerson через инфраструктуру к другой системе. Один на человека. Занимает от 200 до 400 мсек.
  • Должно быть в состоянии завершить в течение двух дней

Приятно иметь

  • Checkpointing. Если я собираюсь работать в течение длительного времени, я уверен, что хотел бы иметь возможность перезапустить процесс, не начиная с самого начала. ...

Как бы вы спроектировали это? Позже я добавлю текущий хак и мою краткую идею

========== Текущее решение ================

Он работает на BEA / Oracle Weblogic Integration, не по выбору, а по определению

Когда файл получен, каждая строка считывается в базу данных с

id, line, status,batchfilename
и статус «Требуется обработка»

Когда все строки находятся в базе данных, строки разделяются по модулю 4, и процесс запускается для каждой четверти строк, и каждая нуждающаяся в нем строка обогащается вызовом getPerson, а статус устанавливается на «Обработано». (38,0000 в текущей партии).

Когда все 4 четверти строк обработаны, процесс записи запускается путем выбора 100 строк из этой базы данных, записи их в файл и обновления их статуса на «Записано». Когда все готово, новый файл передается обратно в инфраструктуру маршрутизации, и операционная команда отправляет электронное письмо с сообщением «я готов».

4 процесса обработки могут / не получатся, поэтому можно перезапустить их с помощью http get для сервлета в WLI.

Ответы [ 3 ]

4 голосов
/ 21 января 2009

Упростите как можно больше.

Пакеты (пытаясь обработать их как единицы и их различные размеры), по-видимому, отбрасываются с точки зрения простейшего процесса. Звучит так, будто строки атомарные, а не партии.

Подача всех строк в виде отдельных атомарных транзакций через асинхронную очередь сообщений FIFO с хорошим механизмом обнаружения (и, соответственно, регистрации и маршрутизации сбоев). Тогда вы можете решать проблемы строго в порядке исключения. (Таблица очередей в вашей базе данных, вероятно, может работать.)

Поддерживать идентификацию партии только с помощью столбца в записи сообщения и суммировать партии таким образом, как вам нужно, когда вам нужно.

1 голос
/ 21 января 2009

если обработка файла занимает 2 дня, тогда я бы начал с реализации какой-то функции возобновления. Разделите большой файл на более мелкие и обработайте их один за другим. Если по какой-либо причине вся обработка будет прервана, вам не придется начинать все сначала.

Разделив файл большего размера на файлы меньшего размера, вы также можете использовать больше серверов для обработки файлов.

Вы также можете использовать некоторый массовый загрузчик (например, Oracle SQL Loader), чтобы поместить большой объем данных из файла в таблицу, снова добавив столбец, чтобы пометить, была ли обработана строка, чтобы вы могли выбрать Вы остановились, если процесс должен завершиться сбоем.

Возвращаемым значением может быть множество небольших файлов, которые в конце будут объединены в один большой файл. Если выбран подход с использованием базы данных, вы также можете сохранить результаты в таблицу, которую затем можно извлечь в файл CSV.

1 голос
/ 21 января 2009

Когда вы получите файл, проанализируйте его и поместите информацию в базу данных.

Создайте одну таблицу с записью на строку, для которой потребуется запрос getPerson.

Пусть один или несколько потоков получают записи из этой таблицы, выполняют запрос и помещают заполненную запись обратно в таблицу.

Как только все записи обработаны, создайте полный файл и верните его.

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