У меня есть требование создать компонент молнии, чтобы пользователи могли загружать файлы csv. Эти файлы содержат 100 тысяч строк, и несколько пользователей могут одновременно загружать большие файлы. Одновременно можно загрузить 15 файлов по 100 тыс. строк в каждом. Мне нужен класс вершины, который обрабатывает эти файлы и создает лиды или контакты из строк на основе некоторой бизнес-логики. Моей первой мыслью было запустить апекс-пакет для обработки файлов, но разрешено только до 5 поставленных в очередь или активных пакетных заданий. Поэтому, если я запускаю апекс-пакет для каждого файла, будет обработано до 5 файлов, но если 6-й сработает, пока первые 5 пакетов активны или находятся в очереди, 6-й завершится ошибкой. Любые мысли или рекомендации? Заранее спасибо!

0
user82512 22 Апр 2020 в 23:38

1 ответ

Это не то, что нужно делать в Apex, и, скорее всего, не может быть.

Если ваш файл содержит 100 000 строк, и каждая строка содержит всего 60 символов, вы уже достигли предела длины строки в 6 миллионов символов. Даже в асинхронном контексте существует чрезвычайно высокая вероятность того, что вы также достигнете предела кучи.

Кроме того, Apex очень плохо анализирует данные CSV.

Я рекомендую вам сделать одно из двух:

  • Создайте процесс синтаксического анализа и логику импорта на внешнем интерфейсе в JavaScript, используя одну из различных доступных библиотек синтаксического анализа CSV и выполняя вызовы, которые необходимо выполнить, в серверную часть Apex для сохранения записей. Я бы применил этот подход только в том случае, если указанные вами цифры значительно выше, чем в типичном приложении.

    Обратите внимание, что ваш пользователь должен будет оставаться на странице в течение всего процесса импорта, что может быть довольно болезненным при 1,5 миллионах импортированных записей (100 000 * 15 файлов).

  • Используйте корпоративное решение промежуточного программного обеспечения ETL, которое может взаимодействовать с Bulk API и в идеале предлагает вам дедупликацию или в котором вы можете создавать дедупликацию и логику сопоставления/вставки. Если вы действительно предлагаете вводить в базу данных 1,5 миллиона записей на пользователя на регулярной основе, вам нужно гораздо более целостно продумать свою стратегию сбора и управления данными, а также использовать инструменты, предназначенные для поддержки такой тип потока данных.

Разрешено 5 заданий в очереди или активных пакетных заданий.

Это не точно; вы можете иметь 100 заданий в очереди Apex Flex. Это не меняет того факта, что с архитектурной точки зрения это не лучший вариант.

3
David Reed 22 Апр 2020 в 23:53