Сервер A имеет процесс, который экспортирует n таблиц базы данных в виде плоских файлов. Сервер B содержит утилиту, которая загружает плоские файлы в базу данных устройства DW.
Процесс выполняется на сервере А, который экспортирует и сжимает около 50-75 таблиц. Каждый раз, когда таблица экспортируется и создается файл, также создается файл .flag.
Сервер B имеет процесс bash, который многократно проверяет каждый файл .flag, созданный сервером A. Он делает это, подключаясь к A и проверяя наличие файла. Если файл флага существует, сервер B извлечет файл с сервера A, распакует его и загрузит в базу данных аналитики. Если файл еще не существует, он будет спать в течение n секунд и повторите попытку. Этот процесс повторяется для каждой таблицы / файла, которые сервер B ожидает найти на сервере A. Процесс выполняется последовательно, обрабатывая один файл за раз.
Дополнительно: Процесс, который выполняется на сервере A, не может «отправить» файл на сервер B. Из-за размера файла и географических особенностей сервер A не может загрузить плоский файл в устройство DW.
Я считаю, что этот процесс громоздок и просто так может быть переписан / обновлен. Я предлагаю решение на основе обмена сообщениями. Сначала я думал, что это будет хорошим кандидатом на RabbitMQ (или тому подобное), где
Сервер A записывает файл, сжимает его и затем создает сообщение для очереди.
Сервер B будет подписываться на очередь и обрабатывать файлы, названные в теле сообщения.
Мне кажется, что подход, основанный на обмене сообщениями, не только сэкономит время, поскольку он устранит цикл проверки-ожидания-повторения для каждой таблицы, но также позволит нам запускать процессы параллельно (поскольку нет никаких зависимостей).
Я показал моей команде подтверждение концепции с использованием RabbitMQ, и все они были восприимчивы к использованию сообщений. Некоторые из них быстро определили другие возможности, где мы могли бы извлечь выгоду из обработки сообщений. Одной из таких областей, в которой нам было бы полезно реализовать обмен сообщениями, было бы заполнение наших измерений DW в реальном времени, а не в пакетном режиме.
Тогда мне пришло в голову, что решение на основе MQ может быть излишним, учитывая малый объем (50-75 задач). Это может быть излишним, учитывая, что наша операционная команда должна будет установить RabbitMQ (и его зависимости, включая Erlang), и это приведет к новым головным болям администрации.
Затем я понял, что это можно сделать проще с помощью решения на основе REST. Сервер A может создать файл и затем выполнить HTTP-вызов простой веб-службы (web.py) на сервере B. Сервер B может затем инициировать процесс передачи и загрузки на основе вызываемого URL-адреса. Учитывая время, необходимое для передачи, распаковки и загрузки каждого файла, я бы, вероятно, использовал многопроцессорную обработку Python для создания подпроцесса, который загружает каждый файл.
Я думаю, что решение на основе REST - это идея, учитывая тот факт, что оно проще. По моему мнению, использование MQ было бы более уместным для задач с большим объемом, но мы говорим только (на данный момент) о 50-75 операциях с потенциально большим количеством впереди.
Будет ли REST-based хорошим решением, учитывая мои требования и объем? Существуют ли другие платформы или продукты OSS, которые уже делают это? Я хочу добавить обмен сообщениями, не создавая других проблем при администрировании и разработке.