Можно ли одновременно использовать преобразование содержимого MLCP и триггеры во время приема документа?

Насколько я понимаю, для изменения загруженных документов можно использовать как преобразование MLCP, так и триггер. Разница в том, что преобразование содержимого работает с объектом документа в памяти во время приема, тогда как триггер может запускаться после создания документа.

Мне кажется, что нет причин, по которым я не могу использовать их оба вместе. Мои варианты использования заключаются в том, что мне нужно обновить некоторые узлы документов после их загрузки в базу данных. Причина, по которой я использую триггер, заключается в том, что выполнение той же логики в преобразовании MLCP с использованием модуля in-mem-update всегда вызывало сбой приема, предположительно из-за большого размера файла и большого количества узлов, которые я пытался обновить.

2018-08-22 23:02:24 ОШИБКА TransformWriter: 546 - Исключение: ошибка анализа заголовков HTTP: попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через определенный период времени, или установленное соединение не удалось, потому что подключенный хост не смог реагировать

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

Есть ли какая-то внутренняя причина, по которой я не могу использовать их оба вместе? Или это проблема, связанная с моей конфигурацией? Спасибо!

Изменить:

Я хотел бы предоставить некоторый контекст для разъяснения и сообщить о результатах на основе предложений @ ElijahBernstein-Cooper, @MadsHansen и @grtjn (спасибо!). Я использую MarkLogic Data Hub Framework для приема файлов PDF (некоторые довольно большие) в виде двоичных файлов и извлечения текста в формате XML. Я по сути следовал этому примеру, за исключением того, что использую xdmp:pdf-convert вместо xdmp:document-filter: https://github.com/marklogic/marklogic-data-hub/blob/master/examples/load-binaries/plugins/entities./Guides/input/LoadAsXml/content/content.xqy

Хотя xdmp:pdf-convert, кажется, сохраняет структуру PDF лучше, чем xdmp:document-filter, он также включает некоторые узлы стилизации (<link> и <style>) и атрибуты (class и style), которые мне не нужны. Пытаясь удалить их, я исследовал два разных подхода:

  1. Первый подход заключается в использовании модуля in-mem-update для удаления нежелательных узлов из представления документа в памяти в рамках вышеупомянутого сценария content.xqy как части потока преобразования содержимого. Проблема в том, что процесс может быть довольно медленным, и, как указал @grtjn, я должен ограничить распараллеливание, чтобы избежать тайм-аута.
  2. Второй подход заключается в использовании функции триггера после фиксации для изменения документов с помощью xdmp:node-delete после того, как они были загружены в базу данных. Однако триггер не сработает, если установлено условие запуска document-content("create"). Он срабатывает, если я изменяю условие на document-content("modify"), но по какой-то причине я не могу получить доступ к документу, используя fn:document($trgr:uri), похожий на этот вопрос SO (MarkLogic 9 sjs триггер не может получить доступ к данным документа post-commit ()).

person Fan Li    schedule 23.08.2018    source источник
comment
Быстрый тест, который вы можете попробовать, - использовать преобразование в MLCP, которое не изменяет узел. Это позволит вам узнать, связана ли проблема с тем, как вы преобразовываете документы.   -  person Elijah Bernstein-Cooper    schedule 23.08.2018
comment
Есть ли другие соответствующие сообщения в ErrorLog? Возможно ли, что время вашей транзакции истекло? Вы можете быть ниже порога при выполнении половины работы, но при выполнении преобразования и триггера требуется слишком много времени для заданных пределов.   -  person Mads Hansen    schedule 23.08.2018
comment
@ ElijahBernstein-Cooper Спасибо за предложение! Я тестировал модуль минимального преобразования, который просто возвращает входной контент, и триггер сработал успешно. Так что я надеюсь, что это сузило кругозор. Мое фактическое преобразование является частью структуры концентратора данных, в которой я вызываю xdmp: pdf-convert для обработки входных файлов PDF. Есть ли конфликт с триггером?   -  person Fan Li    schedule 23.08.2018
comment
@MadsHansen Спасибо! Я получил сообщение об ошибке, когда попытался обновить узлы документа с помощью in-mem-update в модуле преобразования (в этом случае триггер не использовался). Я обнаружил, что in-mem-update работает намного медленнее, чем соответствующие функции xdmp: node- *, поэтому я решил использовать триггер для изменения документов после приема.   -  person Fan Li    schedule 23.08.2018
comment
@FanLi, поскольку триггер сработал, когда вы вернули необработанный узел в преобразовании MLCP, я подозреваю, что ваше исходное преобразование возвращает узел / событие, которое не соответствует критериям триггера. Я не вижу причин, по которым xdmp: pdf-convert будет конфликтовать с триггером. Я предлагаю просмотреть конфигурацию триггерного события: docs.marklogic.com/trgr:trigger- событие-данные   -  person Elijah Bernstein-Cooper    schedule 23.08.2018
comment
Сообщение об ошибке для меня в основном похоже на тайм-аут на стороне клиента. Вы пробовали сократить потоки и размер транзакции? Попробуйте -transaction_size 1 -batch_size 1 -thread_count 1   -  person grtjn    schedule 23.08.2018
comment
@ ElijahBernstein-Cooper Вы правы. После того как я изменил критерий срабатывания с document-content("create") на document-content("modify"), триггер сработал во время приема. Однако я не понимаю, почему это так. Теперь моя проблема в том, что я не могу получить документ с помощью fn:document($trgr:uri), что может быть связано с этим вопросом: stackoverflow.com / q / 47856917/3546482   -  person Fan Li    schedule 24.08.2018
comment
@grtjn Спасибо. Ваша конфигурация работала с модулем in-mem-update, хотя загрузка стала очень медленной. Есть ли способ устранить тайм-аут, не слишком жертвуя скоростью?   -  person Fan Li    schedule 24.08.2018
comment
Вы можете увеличить thread_count, но делайте это небольшими шагами. Проверьте системные ресурсы, чтобы отслеживать перегрузку процессора или памяти. Если вы попытаетесь обрабатывать слишком много параллельно на одном хосте, вы просто подавите систему, и таймауты появятся снова. Вы также можете масштабировать свой кластер. Вы также можете выполнить преобразование в pdf в триггерах после фиксации или в порожденных процессах. CPF может быть полезен для этого. Только будьте осторожны, чтобы не переполнить очередь задач ..   -  person grtjn    schedule 24.08.2018


Ответы (1)


Преобразования и триггеры MLCP работают независимо. В этих преобразованиях нет ничего, что могло бы помешать работе триггеров как таковых.

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

У триггеров тоже есть область действия. Они настроены на поиск каталога или коллекции. Убедитесь, что ваша конфигурация MLCP соответствует области действия триггера и что ваше преобразование не влияет на URI таким образом, что она больше не соответствует области каталога, если она используется.

Однако, если присмотреться к сообщению об ошибке, я бы сказал, что это вызвано тайм-аутом. Таймауты могут происходить как на стороне сервера (10 минут по умолчанию), так и на стороне клиента (может зависеть от настроек на стороне клиента, но может быть намного меньше). В сообщении в основном говорится, что сервер слишком долго отвечал, поэтому я бы сказал, что вы столкнулись с тайм-аутом на стороне клиента.

Тайм-ауты могут быть вызваны слишком маленькими временными рамками. Вы можете попробовать увеличить настройки тайм-аута на стороне сервера (xdmp:set-request-time-limit()) и на стороне клиента (не знаю, как это сделать на Java).

Однако чаще всего вы просто пытаетесь сделать слишком много одновременно. MLCP открывает транзакции и пытается выполнить несколько пакетов в рамках этой транзакции, также известной как transaction_size. Каждый пакет содержит несколько документов размером batch_size. По умолчанию MLCP пытается обработать 10 x 100 = 1000 документов за транзакцию.

По умолчанию он также работает с 10 потоками, поэтому обычно открывает 10 транзакций одновременно и пытается запустить 10 потоков для параллельной обработки 1000 документов каждый. С простыми вставками это нормально. Из-за более тяжелой обработки в преобразованиях или триггерах перед фиксацией это может стать узким местом, особенно когда потоки начинают конкурировать за ресурсы сервера, такие как память и процессор.

Такие функции, как xdmp:pdf-convert, часто могут быть довольно медленными. Для начала это зависит от внешнего плагина, но также представьте, что он должен обрабатывать 200-страничный PDF-файл. Бинарные файлы могут быть большими. Вы захотите замедлить темп, чтобы обработать их. Если использование -transaction_size 1 -batch_size 1 -thread_count 1 заставляет ваши преобразования работать, вы действительно столкнулись с тайм-аутом и, возможно, переполнили ваш сервер. Оттуда вы можете посмотреть на увеличение некоторых чисел, но двоичные размеры могут быть непредсказуемыми, поэтому будьте осторожны.

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

HTH!

person grtjn    schedule 24.08.2018
comment
Спасибо, @grtjn. Я настрою распараллеливание по вашему совету. Я буду искать в CPF более надежное решение в будущем. - person Fan Li; 24.08.2018