Что произойдет, если питание отключится, пока мы вставляем в базу данных? - PullRequest
2 голосов
/ 22 февраля 2020

Мне недавно задали вопрос в интервью, если кто-нибудь может помочь мне разобраться.

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

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

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Я думаю, что вы должны:

  1. Хранить где-нибудь ссылку на файл (идентификатор, индекс обработанного файла - действительно зависит от случая).
  2. Вам необходимо определить границы одной транзакции - пусть это будет полная обработка одного файла, так: прочитайте файл, разбейте его на части, сохраните данные в базе данных и обновите ссылку на файл, который вы обработали. Если все это удастся, вы можете зафиксировать транзакцию в базе данных.
  3. Вы, основная задача, которая обработает все файлы, должны обратиться к справочной таблице и на основе ее состояния featch следующий файл.

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

Обратите внимание, что в большинстве сценариев это очень простой пример ios вы хотите, чтобы транзакции были минимальными насколько это возможно.

1 голос
/ 22 февраля 2020

Это может быть одним из способов:

  • L oop over:
    1. Получить файл
      • Проверить, что запрос не был обработан с запросом в базу данных.
    2. Обработка файла
      • Обновление базы данных
      • Обновление базы данных с помощью журнала обработанного файла
    3. Фиксация
    4. Перемещение файла из необработанной очереди

Вы также можете записать запись файла в другой постоянный ресурс .


Q. Что делать, если есть много файлов. Разве запись в журналы не замедляет процесс?
A: Вероятно, немного, это всего лишь одна запись в базе данных на файл. Это стоимость устойчивости.

В: Что, если файлы настолько малы, что они обновляют только одну строку на файл?
A: Сделайте ваш запрос на обновление идемпотентным. Не регистрируйте, но убедитесь, что файлы будут удалены из очереди после завершения транзакции.

В: Что, если в файле много строк. Вы действительно хотите перезапустить с первой строки файла?
A: Зависит от стоимости / выгоды. Вы можете разбить файл на более мелкие перед обработкой каждого вложенного файла. Если отключение питания происходит постоянно, это хороший компромисс. Если это происходит очень редко, дополнительная работа системы может не стоить этого.

A: Что, если есть смешанные файлы малого и большого размера?
Q: Поместите файлы в отдельные очереди, которые обрабатывать их соответствующим образом.


Идея UPS от @TimBiegeleisen очень хороша. Я испытал сбой одного такого, поэтому вам понадобится два.

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