Chronicle V4 - одновременная запись в той же очереди Chronicle безопасна

Я планирую использовать хронику 4 (SingleChronicleQueue) для IPC.

Я использовал предыдущую хронику 3 (IndexedQueue), и она не была потокобезопасной, и я использовал для создания нескольких очередей для каждого потока, но кто-то сказал мне, что с помощью SingleChronicleQueue я могу использовать 1 очередь для всех потоков в JVM.

Но хорошо ли это, если 2 разных процесса пытаются одновременно писать в одну и ту же очередь хроники, будет ли это безопасно?

Рекомендуется ли это делать или для разных процессов мне нужно создавать разные очереди.


person user3887600    schedule 24.08.2017    source источник


Ответы (1)


Спасибо за вопрос о продуктах Chronicle Software.

Соответствующая ссылка в документации: https://github.com/OpenHFT/Chronicle-Queue#single-chronicle-queue

Ключевая фраза: «одновременные записи на одной машине».

Chronicle-Queue использует операции сравнения и замены для атомарной модификации разделяемой памяти вне кучи, которая поддерживает экземпляр очереди, поэтому несколько процессов могут записывать и считывать в/из очереди на одном компьютере.

Надеюсь, это ответит на ваш вопрос.

С уважением, Терри

person Terry Williams    schedule 24.08.2017
comment
ВАЖНО: я хочу добавить, что ExcerptAppender или ExcerptTailer не должны совместно использоваться потоками. - person Terry Williams; 24.08.2017
comment
Вы имеете в виду, что ExcerptAppender и ExcerptTailer не являются потокобезопасными? - person Krishas; 29.08.2017
comment
Привет Кришас. Это правильно, эти объекты небезопасны для доступа из нескольких потоков. - person Terry Williams; 29.08.2017
comment
Документация дает указания о том, как писать в[1] и читать из[2] очереди. Вызов AcquireAppender() в очереди вернет локальный для потока ExcerptAppender, который можно повторно использовать внутри того же потока. Однако этот метод довольно дешев, поэтому мы рекомендуем просто вызывать acquireAppender() всякий раз, когда вам нужно записать в очередь. Вызов createTailer() в очереди вернет новый экземпляр ExcerptTailer. Опять же, это можно повторно использовать внутри одного и того же потока, но его не следует передавать другим потокам. - person Terry Williams; 29.08.2017
comment
Хорошо прикрыто +1 - person Peter Lawrey; 06.09.2017
comment
Спасибо, Терри. Хорошо объяснил. +1 - person Krishas; 11.09.2017
comment
Привет, Терри, поэтому я попытался создать одно приложение для каждого потока, и когда я это сделал, я получил исключение: java.nio.BufferOverflowException, вызванное java.nio.channels.OverlappingFileLockException. Это работает только для определенной файловой системы? - person Mag; 04.05.2018