Я работаю над решением для финансовой индустрии. Основной функциональностью приложения является возможность загружать массивные входные файлы, переваривать их, обновлять состояние в постоянном хранилище и генерировать выдержки из постоянного хранилища по запросу. Довольно просто.
Входные файлы представляют собой отформатированные в формате XML большие (более сотни мегабайт) сообщения, содержащие много повторяющихся записей. Постоянное хранилище - это реляционная база данных. Движок реализован в виде приложения Java на основе POJO (Spring Framework в качестве основы), развертываемого на сервере приложений J2EE.
Вопрос касается масштабируемости и производительности решения. Если приложение последовательно обрабатывает записи из XML, масштабируемость решения довольно низкая. нет способа задействовать более одного экземпляра приложения для обработки одного файла. Вот почему я ввел параллельную обработку для записей из входного XML-файла. По сути, идея состоит в том, чтобы отправить обработку отдельных записей для работников из пула. Я решил использовать JMS для отправки. Компонент, который загружает файл, читает поток и просто извлекает отдельные записи и передает очередь отправки. На другом конце очереди находится ряд одновременных потребителей. Каждый выбирает одно сообщение из очереди и обрабатывает запись, и она сразу же доступна для обработки другой записи. Это очень похоже на сервлеты в веб-контейнере. Что мне показалось особенно мощным в этом подходе, так это то, что работники могут находиться в отдельных экземплярах приложения, развернутого на удаленных серверах, до тех пор, пока очередь является общей. К сожалению, все работники подключаются к одной и той же базе данных, которая поддерживает постоянное хранилище, и это может стать узким местом, если сервер баз данных не достаточно мощный, чтобы справиться с нагрузкой от одновременных работников.
Что вы думаете об этой архитектуре? У вас было похожее приложение для дизайна? Какой был твой дизайн тогда?