В нашем проекте ESB у нас есть много маршрутов чтения файлов с протоколом file2
или ftp
для дальнейшей обработки. Важно отметить, что файлы, которые мы читаем локально (протокол file2
), подключаются к общим сетевым ресурсам через разные протоколы (NFS, SMB).
Теперь у нас проблемы с условиями гонки. Оба сервера читают файл и обрабатывают его. Мы уменьшили вероятность этого с помощью опции preMove
, но время от времени повторное чтение все еще происходит, когда оба сервера опрашивают в одну и ту же миллисекунду. Согласно документации, idempotentRepository
вместе с readLock=idempotent
могут помочь, например, с HazelCast.
Однако мне интересно, подходит ли это решение для моей проблемы, поскольку я не знаю, будет ли оно работать во всех случаях. За считанные миллисекунды оба сервера читают файл, поэтому информация о том, что один сервер уже обработал файл, должна быть доступна в сетке HazelCast в тот момент, когда второй сервер пытается прочитать. Это возможно? Что произойдет, если будут минимальные задержки (например, связанные с сетью)?
Кроме того, настройка readLock=idempotent
доступна только для file2
, но не для ftp
. Как решить эту проблему там?
Опять же: проблема не в том, чтобы предотвратить повторное копирование файлов, а в том, чтобы предотвратить гонку.