Directory as a queue

Palych
Уже с Приветом
Posts: 13684
Joined: 16 Jan 2001 10:01

Directory as a queue

Post by Palych »

Задача: сваливать сообщения в таблицу.
Причём база довольно далеко, а времени на запись много тратить нельзя.
Как полагается берём queuing system (IBM MQ), пишем туда, а потом не торопясь перекидываем в базу.
Вопрос: а ну как вместо MQ каждое сообщение писать в файл в некоей директории?
И соответственно читать содержимое директории, обрабатывать файлы и удалять их?
Где подвох?
User avatar
Teh Instructor
Уже с Приветом
Posts: 5766
Joined: 25 Feb 2001 10:01
Location: Силиконовая Долина

Re: Directory as a queue

Post by Teh Instructor »

Palych wrote:... вместо MQ каждое сообщение писать в файл в некоей директории?
И соответственно читать содержимое директории, обрабатывать файлы и удалять их?
Где подвох?
Нет подвоха. Так многие и делают. Единственное, надо избегать ситуаций, когда не до конца записанный файл начинает обрабатываться. Для этого файл сначала записывают где-то в другом месте на том же диске, а потом перемещают в ту папку, которая служит как очередь.
И если обработчиков очереди несколько и они работают параллельно - тот же трюк с обработкой. Сначала файл перемещают (это атомарная операция) а оттуда уже обрабатывают и удаляют.
one Nation under God, indivisible, with liberty and justice for all
Palych
Уже с Приветом
Posts: 13684
Joined: 16 Jan 2001 10:01

Re: Directory as a queue

Post by Palych »

Teh Instructor wrote: Единственное, надо избегать ситуаций, когда не до конца записанный файл начинает обрабатываться.
А в чём проблема? Пишем в конец, читаем с начала.
Получается FIFO...
User avatar
Teh Instructor
Уже с Приветом
Posts: 5766
Joined: 25 Feb 2001 10:01
Location: Силиконовая Долина

Re: Directory as a queue

Post by Teh Instructor »

Palych wrote:
Teh Instructor wrote: Единственное, надо избегать ситуаций, когда не до конца записанный файл начинает обрабатываться.
А в чём проблема? Пишем в конец, читаем с начала.
Получается FIFO...
Логика сложнее получается. Придется обрабатывать ситуации если читатель прочитал данные, которые еще не целостные (типа логический "блок" не до конца записан).
Проще с самого начала определить, что если есть файл, то это целый блок информации готовый к обработке. И полагаться на атомарность операции перемещения файла.
one Nation under God, indivisible, with liberty and justice for all
Palych
Уже с Приветом
Posts: 13684
Joined: 16 Jan 2001 10:01

Re: Directory as a queue

Post by Palych »

Teh Instructor wrote:Придется обрабатывать ситуации если читатель прочитал данные, которые еще не целостные (типа логический "блок" не до конца записан).
А чего там обрабатывать?
Файл представляет собой "логический блок": одно сообщение. От начала до EOF.
Если читатель читает, а писатель ещё не дописал - читатель просто остановится...
Palych
Уже с Приветом
Posts: 13684
Joined: 16 Jan 2001 10:01

Re: Directory as a queue

Post by Palych »

Palych wrote:Если читатель читает, а писатель ещё не дописал - читатель просто остановится...
Извиняюсь - куйню сковал! :oops:
Выдал желаемое за действительное.
Palych
Уже с Приветом
Posts: 13684
Joined: 16 Jan 2001 10:01

Re: Directory as a queue

Post by Palych »

Teh Instructor wrote:Единственное, надо избегать ситуаций, когда не до конца записанный файл начинает обрабатываться. Для этого файл сначала записывают где-то в другом месте на том же диске, а потом перемещают в ту папку, которая служит как очередь.
И если обработчиков очереди несколько и они работают параллельно - тот же трюк с обработкой. Сначала файл перемещают (это атомарная операция) а оттуда уже обрабатывают и удаляют.
Кстати, в принципе лучше не перемещать файлы, а переименовывать их.
Перемещение - это изменение двух директорий, а переименование - одной...
Palych
Уже с Приветом
Posts: 13684
Joined: 16 Jan 2001 10:01

Re: Directory as a queue

Post by Palych »

Update (Если кому интересно)
обнаружилась весьма пакостная вешь: Походу чтение директории и удаление файлов при определённых условиях (например много файлов) бывают не consistent:
можно увидеть файл, который был удалён, причём около секунды назад.
RHEL 5, ext3, как я понимаю - диск на каком-то SAN...
User avatar
Teh Instructor
Уже с Приветом
Posts: 5766
Joined: 25 Feb 2001 10:01
Location: Силиконовая Долина

Re: Directory as a queue

Post by Teh Instructor »

Palych wrote:Update (Если кому интересно)
обнаружилась весьма пакостная вешь: Походу чтение директории и удаление файлов при определённых условиях (например много файлов) бывают не consistent:
можно увидеть файл, который был удалён, причём около секунды назад.
RHEL 5, ext3, как я понимаю - диск на каком-то SAN...
Это нормальное дело, особенно заметно на SAN из-за сетевых задержек
Поэтому если несколько параллельных обработчиков разбирают очередь которая сделана как папка диске, перед тем как обрабатывать они должны файл перемещать "к себе", туда где его никто не может трогать. На этой операции перемещения конфликты и будут разрешаться - кто-то будет получать ошибку при этом
one Nation under God, indivisible, with liberty and justice for all
Palych
Уже с Приветом
Posts: 13684
Joined: 16 Jan 2001 10:01

Re: Directory as a queue

Post by Palych »

Похоже дело в моей дремучести: проблема выскакивала в одном процессе (JVM)
Я решил на старости лет заюзать java NIO.
Директорию читал через Files.newDirectoryStream(), а файлы перекидывал через Files.move()...
Похоже DirectoryStream кеширует что-то внутре...
А каноны предписывают SecureDirectoryStream для таких вещей.
User avatar
Леонид Ильич Брежнев
Уже с Приветом
Posts: 8632
Joined: 22 Mar 2011 01:40

Re: Directory as a queue

Post by Леонид Ильич Брежнев »

Palych wrote:А каноны предписывают SecureDirectoryStream для таких вещей.
http://tamanmohamed.blogspot.com/2012/0 ... tream.html
http://www.java2s.com/Code/Java/JDK-7/U ... Stream.htm
iDesperado
Уже с Приветом
Posts: 1349
Joined: 28 Nov 2008 17:50

Re: Directory as a queue

Post by iDesperado »

Palych wrote:Update (Если кому интересно)
обнаружилась весьма пакостная вешь: Походу чтение директории и удаление файлов при определённых условиях (например много файлов) бывают не consistent:
можно увидеть файл, который был удалён, причём около секунды назад.
RHEL 5, ext3, как я понимаю - диск на каком-то SAN...
вы почитайте о линуксовых фс хоть что-то, а то сейчас наворотите. линукс позволяет удалить открытые другими процессами файлы, просто реально удаление произойдет когда последний процесс файл закроет файл
Palych
Уже с Приветом
Posts: 13684
Joined: 16 Jan 2001 10:01

Re: Directory as a queue

Post by Palych »

iDesperado wrote:
Palych wrote:Update (Если кому интересно)
обнаружилась весьма пакостная вешь: Походу чтение директории и удаление файлов при определённых условиях (например много файлов) бывают не consistent:
можно увидеть файл, который был удалён, причём около секунды назад.
RHEL 5, ext3, как я понимаю - диск на каком-то SAN...
вы почитайте о линуксовых фс хоть что-то, а то сейчас наворотите. линукс позволяет удалить открытые другими процессами файлы, просто реально удаление произойдет когда последний процесс файл закроет файл
Я всегда думал что unlink не трогает файл, но изменяет директорию. Неужели и это не так? "Ах, я этого не вынесу! :yad: "
В моём случае я вижу файл после удаления вторично проходя по директории с помошью Files.newDirectoryStream().

Return to “Вопросы и новости IT”