Я использую Apache Camel для передачи файлов из входного каталога в брокер сообщений. Файлы пишутся через SFTP. Чтобы избежать использования неполных файлов, которые все еще находятся в процессе передачи, я установил readLock=changed
и readLockCheckInterval=3000
.
. Например, один из моих тестов выглядит так:
<route>
<from uri="file:inbox?readLock=changed&readLockCheckInterval=3000"/>
<log message="copying ${file:name}"/>
<to uri="file:outbox"/>
</route>
Я проверяю это с (echo line 1; sleep 2; echo line 2) > inbox/test
, и файл точно копируется, когда readLockCheckInterval=3000
. Однако это не масштабируется, потому что компонент file
будет ждать три секунды перед обработкой каждого файла. Поэтому, когда я тестирую с
for n in $(seq 1 100); do (echo line 1; sleep 2; echo line 2) > inbox/$n & done
, верблюду требуется пять минут, чтобы переместить файлы с inbox
на outbox
.
Я прочитал главу о параллельной обработке в Camel в книге действий. Но примеры фокусируются на распараллеливании обработки строк в одном потребляемом файле. Я не мог найти способ распараллелить самого потребителя.
Пропускная способность около одного файла в секунду была бы хорошей в моем случае использования. Мне просто не нравится идея быть вынужденным рисковать неполными данными, чтобы достичь этого. Параметр readLock=changed
в любом случае кажется хаком, но мы не можем сказать клиенту, что нужно копировать, а затем переместить, так что другого варианта, похоже, не существует.
Как повысить пропускную способность, не жертвуя целостностью в лицо сетевых задержек?