#mysql #node.js #express #export #long-running-processes
Вопрос:
извините, если вопрос звучит действительно глупо, я просто не знаю, что искать в Google.
Допустим, у меня есть функция, которая получает 10000 строк из базы данных, обрабатывает их и возвращает в виде файла Excel.
Это работает, но заняло около 2-3 минут и замедлило другие операции до обхода , затем я планирую переместить функцию экспорта на свой собственный сервер, это означает, что у меня запущено 2 экспресс — сервера, 1 для панели администратора, 1 исключительно для функции экспорта.
таким образом, панель администратора сообщит серверу экспорта через сокет.ввод-вывод для выполнения процесса экспорта
вопрос о том, какой метод/технологию лучше всего использовать, если я хочу разрешить серверу экспорта экспортировать данные в течение примерно 30 минут, и если есть еще один запрос на экспорт, он будет ждать завершения первого. Точно так же, как если вы попросите Google предоставить ваши данные, они сделают это через несколько дней, но вы не будете ждать на одном экране несколько дней, они просто отправят вам электронное письмо, когда вы закончите
на самом деле я спрашиваю, какое слово или технологию я должен использовать в Google, чтобы узнать, как называется весь этот процесс, который я описал. извините, если вопрос звучит действительно глупо, я просто не знаю, что искать в Google.
Ответ №1:
Пара вещей:
- Размещение этой секретной инструкции SQL УРОВНЯ ИЗОЛЯЦИИ ТРАНЗАКЦИЙ непосредственно перед давно выполняемой инструкцией SQL для выполнения экспорта уменьшит помехи между вашим экспортом и остальной частью вашей операции.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Это позволяет выполнять экспорт без вмешательства в другие рабочие нагрузки базы данных. Но важно, что это означает, что строки, обновленные / удаленные / вставленные во время выполнения экспорта, могут быть прочитаны неправильно. Если экспорт выполняется только для исторических данных или в рабочей нагрузке используется не так много транзакций, риск неверных данных минимален.
Без этого ваш экспорт, скорее всего, все равно будет мешать остальной рабочей нагрузке на базу данных, даже если вы разместите ее на отдельном сервере nodejs / express.
- Концепция, которую вы хотите использовать для выполнения этих «автономных» экспортных операций по одному, — это рабочая очередь. Очередь может быть очень простой: просто массив. Вы помещаете вещи в рабочую очередь с помощью
queue.push(queueItem)
и уберите их из очереди, когда будете готовы их выполнить.
const queueItem = queue.count > 0 ? queue.shift() : null
Или, при необходимости, рабочие очереди могут быть гораздо более сложными. Очередь сообщений, redis и apache kafka-это лишь некоторые альтернативные подходы.