Directory as a queue
-
- Уже с Приветом
- Posts: 13684
- Joined: 16 Jan 2001 10:01
Directory as a queue
Задача: сваливать сообщения в таблицу.
Причём база довольно далеко, а времени на запись много тратить нельзя.
Как полагается берём queuing system (IBM MQ), пишем туда, а потом не торопясь перекидываем в базу.
Вопрос: а ну как вместо MQ каждое сообщение писать в файл в некоей директории?
И соответственно читать содержимое директории, обрабатывать файлы и удалять их?
Где подвох?
Причём база довольно далеко, а времени на запись много тратить нельзя.
Как полагается берём queuing system (IBM MQ), пишем туда, а потом не торопясь перекидываем в базу.
Вопрос: а ну как вместо MQ каждое сообщение писать в файл в некоей директории?
И соответственно читать содержимое директории, обрабатывать файлы и удалять их?
Где подвох?
-
- Уже с Приветом
- Posts: 5766
- Joined: 25 Feb 2001 10:01
- Location: Силиконовая Долина
Re: Directory as a queue
Нет подвоха. Так многие и делают. Единственное, надо избегать ситуаций, когда не до конца записанный файл начинает обрабатываться. Для этого файл сначала записывают где-то в другом месте на том же диске, а потом перемещают в ту папку, которая служит как очередь.Palych wrote:... вместо MQ каждое сообщение писать в файл в некоей директории?
И соответственно читать содержимое директории, обрабатывать файлы и удалять их?
Где подвох?
И если обработчиков очереди несколько и они работают параллельно - тот же трюк с обработкой. Сначала файл перемещают (это атомарная операция) а оттуда уже обрабатывают и удаляют.
one Nation under God, indivisible, with liberty and justice for all
-
- Уже с Приветом
- Posts: 13684
- Joined: 16 Jan 2001 10:01
Re: Directory as a queue
А в чём проблема? Пишем в конец, читаем с начала.Teh Instructor wrote: Единственное, надо избегать ситуаций, когда не до конца записанный файл начинает обрабатываться.
Получается FIFO...
-
- Уже с Приветом
- Posts: 5766
- Joined: 25 Feb 2001 10:01
- Location: Силиконовая Долина
Re: Directory as a queue
Логика сложнее получается. Придется обрабатывать ситуации если читатель прочитал данные, которые еще не целостные (типа логический "блок" не до конца записан).Palych wrote:А в чём проблема? Пишем в конец, читаем с начала.Teh Instructor wrote: Единственное, надо избегать ситуаций, когда не до конца записанный файл начинает обрабатываться.
Получается FIFO...
Проще с самого начала определить, что если есть файл, то это целый блок информации готовый к обработке. И полагаться на атомарность операции перемещения файла.
one Nation under God, indivisible, with liberty and justice for all
-
- Уже с Приветом
- Posts: 13684
- Joined: 16 Jan 2001 10:01
Re: Directory as a queue
А чего там обрабатывать?Teh Instructor wrote:Придется обрабатывать ситуации если читатель прочитал данные, которые еще не целостные (типа логический "блок" не до конца записан).
Файл представляет собой "логический блок": одно сообщение. От начала до EOF.
Если читатель читает, а писатель ещё не дописал - читатель просто остановится...
-
- Уже с Приветом
- Posts: 13684
- Joined: 16 Jan 2001 10:01
Re: Directory as a queue
Извиняюсь - куйню сковал!Palych wrote:Если читатель читает, а писатель ещё не дописал - читатель просто остановится...
Выдал желаемое за действительное.
-
- Уже с Приветом
- Posts: 13684
- Joined: 16 Jan 2001 10:01
Re: Directory as a queue
Кстати, в принципе лучше не перемещать файлы, а переименовывать их.Teh Instructor wrote:Единственное, надо избегать ситуаций, когда не до конца записанный файл начинает обрабатываться. Для этого файл сначала записывают где-то в другом месте на том же диске, а потом перемещают в ту папку, которая служит как очередь.
И если обработчиков очереди несколько и они работают параллельно - тот же трюк с обработкой. Сначала файл перемещают (это атомарная операция) а оттуда уже обрабатывают и удаляют.
Перемещение - это изменение двух директорий, а переименование - одной...
-
- Уже с Приветом
- Posts: 13684
- Joined: 16 Jan 2001 10:01
Re: Directory as a queue
Update (Если кому интересно)
обнаружилась весьма пакостная вешь: Походу чтение директории и удаление файлов при определённых условиях (например много файлов) бывают не consistent:
можно увидеть файл, который был удалён, причём около секунды назад.
RHEL 5, ext3, как я понимаю - диск на каком-то SAN...
обнаружилась весьма пакостная вешь: Походу чтение директории и удаление файлов при определённых условиях (например много файлов) бывают не consistent:
можно увидеть файл, который был удалён, причём около секунды назад.
RHEL 5, ext3, как я понимаю - диск на каком-то SAN...
-
- Уже с Приветом
- Posts: 5766
- Joined: 25 Feb 2001 10:01
- Location: Силиконовая Долина
Re: Directory as a queue
Это нормальное дело, особенно заметно на SAN из-за сетевых задержекPalych wrote:Update (Если кому интересно)
обнаружилась весьма пакостная вешь: Походу чтение директории и удаление файлов при определённых условиях (например много файлов) бывают не consistent:
можно увидеть файл, который был удалён, причём около секунды назад.
RHEL 5, ext3, как я понимаю - диск на каком-то SAN...
Поэтому если несколько параллельных обработчиков разбирают очередь которая сделана как папка диске, перед тем как обрабатывать они должны файл перемещать "к себе", туда где его никто не может трогать. На этой операции перемещения конфликты и будут разрешаться - кто-то будет получать ошибку при этом
one Nation under God, indivisible, with liberty and justice for all
-
- Уже с Приветом
- Posts: 13684
- Joined: 16 Jan 2001 10:01
Re: Directory as a queue
Похоже дело в моей дремучести: проблема выскакивала в одном процессе (JVM)
Я решил на старости лет заюзать java NIO.
Директорию читал через Files.newDirectoryStream(), а файлы перекидывал через Files.move()...
Похоже DirectoryStream кеширует что-то внутре...
А каноны предписывают SecureDirectoryStream для таких вещей.
Я решил на старости лет заюзать java NIO.
Директорию читал через Files.newDirectoryStream(), а файлы перекидывал через Files.move()...
Похоже DirectoryStream кеширует что-то внутре...
А каноны предписывают SecureDirectoryStream для таких вещей.
-
- Уже с Приветом
- Posts: 8632
- Joined: 22 Mar 2011 01:40
Re: Directory as a queue
http://tamanmohamed.blogspot.com/2012/0 ... tream.htmlPalych wrote:А каноны предписывают SecureDirectoryStream для таких вещей.
http://www.java2s.com/Code/Java/JDK-7/U ... Stream.htm
-
- Уже с Приветом
- Posts: 1349
- Joined: 28 Nov 2008 17:50
Re: Directory as a queue
вы почитайте о линуксовых фс хоть что-то, а то сейчас наворотите. линукс позволяет удалить открытые другими процессами файлы, просто реально удаление произойдет когда последний процесс файл закроет файлPalych wrote:Update (Если кому интересно)
обнаружилась весьма пакостная вешь: Походу чтение директории и удаление файлов при определённых условиях (например много файлов) бывают не consistent:
можно увидеть файл, который был удалён, причём около секунды назад.
RHEL 5, ext3, как я понимаю - диск на каком-то SAN...
-
- Уже с Приветом
- Posts: 13684
- Joined: 16 Jan 2001 10:01
Re: Directory as a queue
Я всегда думал что unlink не трогает файл, но изменяет директорию. Неужели и это не так? "Ах, я этого не вынесу! "iDesperado wrote:вы почитайте о линуксовых фс хоть что-то, а то сейчас наворотите. линукс позволяет удалить открытые другими процессами файлы, просто реально удаление произойдет когда последний процесс файл закроет файлPalych wrote:Update (Если кому интересно)
обнаружилась весьма пакостная вешь: Походу чтение директории и удаление файлов при определённых условиях (например много файлов) бывают не consistent:
можно увидеть файл, который был удалён, причём около секунды назад.
RHEL 5, ext3, как я понимаю - диск на каком-то SAN...
В моём случае я вижу файл после удаления вторично проходя по директории с помошью Files.newDirectoryStream().