Советы по проектированию для процесса, параллельно большого объема файлов

Я ищу рекомендации по дизайну для нижеприведенного варианта использования. Я разрабатываю приложение, которое может обрабатывать файлы EXCEL/CSV/JSON. Все они содержат одинаковые столбцы/атрибуты. Имеется около 72 столбцов/атрибутов. Эти файлы могут содержать до 1 миллиона записей.

Теперь у меня есть два варианта обработки этих файлов.

Опция 1

  1. Сервис 1: чтение содержимого из данного файла, преобразование каждой строки в JSON, сохранение записей в таблицу SQL путем пакетной обработки (3 тыс. записей на пакет).
  2. Сервис 2: Извлеките эти записи JSON из таблицы базы данных (которые сохраняются на шаге 1), обработайте их (проверка и расчет) и сохраните окончательные результаты в отдельной таблице.

Вариант 2 (с использованием Rabbit MQ)

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

Опыт POC с Вариантом 1:

  1. Чтение и пакетное сохранение данных в таблицу на 100 тыс. записей заняло 5 минут. (работа службы 1)
  2. If application is trying to process multiple files parallelly which contain 200K records in each of them some times i am seeing deadlocks.
    1. No indexes or relation ships are created on this batch processing table.
    2. Сохранение 3000 записей в пакете во избежание блокировок таблиц.
  3. Пока сервисы обрабатываются, результаты можно отслеживать и запрашивать ход выполнения. Допустим, для файла 1.JSON - 50000 записей успешно обработаны, а остальные 1000 находятся в процессе.
  4. Если служба 1 завершит работу правильно и если что-то пойдет не так со службой 2, у нас все еще будет лучший контроль над повторной обработкой этих записей, поскольку они сохраняются в базе данных.
  5. Я планирую удалить данные в таблице пакетной обработки с помощью ночного задания SQL, если все записи уже обработаны службой 2, поэтому эта таблица будет свежей и готовой для хранения данных для обработки на следующий день.

Опыт POC с вариантом 2:

  1. Для создания (служба 1) и использования сообщений (служба 2) для файла записи размером 100 КБ потребовалось около 2 часов 30 минут.
  2. Нет хранения файловых данных в базе данных, поэтому нет взаимоблокировок (как вариант 1)
  3. Результаты не так отслеживаются, как вариант 1, пока сервисы обрабатывают записи. - Делиться статусом с клиентами, отправившими файл на обработку. Мы можем видеть статус сообщений на экране управления Rabbit MQ для целей мониторинга.
  4. Если служба 1 частично считывает данные из заданного файла и выдает ошибку из-за некоторых проблем, то, насколько мне известно, нет возможности откатить уже опубликованные сообщения в Rabbit MQ, поэтому потребитель продолжает работать над этими опубликованными сообщениями.

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

Согласно приведенным выше фактам, оба варианта имеют свои преимущества и недостатки. Это хороший вариант использования Rabbit MQ? Целесообразно ли производить и потреблять миллионы записей через RabbitMQ? Есть ли лучший способ справиться с этим вариантом использования, кроме этих двух вариантов. Пожалуйста, порекомендуйте.

*** Я использую .Net Core 5.0 и SQL Server 2019. Служба 1 и Служба 2 являются рабочими службами .net core (задания Windows). Все тесты выполняются на моем локальном компьютере, а Rabbit MQ установлен на Docker (докер находится на моем локальном компьютере).


person user1551655    schedule 09.07.2021    source источник
comment
С быстрой загрузкой данных: stackoverflow.com/q/46373895/495455, с использованием очереди или партии зависит. Вы можете использовать очередь для обработки чрезмерных операций записи и пакетную обработку для ускорения массовых вставок, поэтому я бы посоветовал использовать оба варианта, если можете.   -  person Jeremy Thompson    schedule 09.07.2021
comment
Джереми, не видите ли вы каких-либо проблем с обработкой данных файла CSV с помощью Rabbit MQ? целесообразно ли обрабатывать несколько файлов через Очереди. У меня не было опыта работы с Rabbit MQ в других комплектующих POC. Поделитесь, есть ли у него побочные эффекты.   -  person user1551655    schedule 13.07.2021