Мой вариант использования - получить последнее значение для любой ключ в теме Кафки.Для этого я в настоящее время использую GlobalStateStore.
Проблема в том, что, если у меня разные application.id
для каждого экземпляра, создается другой каталог состояния.
То, что я хотел бы, этоповторно использовать существующую директорию хранилища состояний во всех экземплярах, чтобы избежать дублирования данных.Это потому, что все мои экземпляры приложений работают на одном компьютере, поэтому нет смысла иметь разные каталоги состояний.
Я сделал следующее:
Используйте тот же application.id и создали 2 экземпляра потока. Эти 2 экземпляра указывают на один и тот же файл state.dir, но экземпляры хранилища состояний разные (объекты java разные) Statestore1 и Statestore2
, а затем в качестве теста я сделал следующее:
while(true)
{
new Thread(()-> stateStore1.get(key)).start();
new Thread(()-> stateStore2.get(key)).start();
}
и затем я начал производить значения в теме ...
Я заметил, что всеЭкземпляры хранилища состояний (Statestore1 и Statestore2) обновляют одно и то же хранилище состояний (т.е. тот же State.dir) (так как это код)
Я не столкнулся с какими-либо проблемами в тестах, выполняющих это.Но ... я предполагаю, что блокировка записи должна быть получена до записи данных в файл state.dir.Теперь, если по какой-то причине, Statestore1 не снял блокировку, то StatesStore2 будет продолжать ждать?
Мой подход выше безопасен или есть другие способы?
Обновление:
Вариант использования состоит в том, что есть некоторые общие данные, которыми я хотел бы поделиться в разных процессах (разных экземплярах JVM).Поскольку данные являются общими, нет необходимости иметь глобальное хранилище для каждого процесса (поскольку оно будет избыточным).
Все процессы должны иметь возможность чтения и записи в это хранилище, поскольку каждый процесс не зависит отдруг с другом.Поэтому, если один процесс завершается, другой может выполнять свою работу (сохранить последнее значение в глобальном хранилище и получить его при необходимости).