Совместное использование индекса хранилища файлов с несколькими открытыми приложениями на Java

Я пишу библиотеку HTTP Cache для Java, и я пытаюсь использовать эту библиотеку в том же приложении, которое запускается дважды. Я хочу иметь возможность разделять кеш между этими экземплярами.

Какое для этого лучшее решение? Я также хочу иметь возможность писать в то же хранилище, и оно должно быть доступно для обоих экземпляров.

Теперь у меня есть основанный на памяти индекс файлов, доступных для кеша, и он не может использоваться на нескольких виртуальных машинах. Он сериализуется между запусками, но это не сработает для общего кеша.

Согласно спецификации HTTP, я не могу просто сопоставить файлы с URI, так как в зависимости от запроса может быть вариант одной и той же полезной нагрузки. Например, у меня может быть запрос, который зависит от заголовка accept-language: в этом случае у меня будет другой файл для каждого последующего запроса, который указывает другой язык.

Есть идеи?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
444
2

Ответы 2

Я думаю, вам стоит взглянуть на WebDav-Технические характеристики. Это расширение HTTP для совместного использования / редактирования / хранения / управления версиями ресурсов на сервере. Существует реализация как Модуль Apache, которая позволяет быстро начать их использовать.

Поэтому вместо реализации собственной реализации кэш-сервера вам может быть лучше использовать локальный экземпляр Apache + mod-dav, доступный для обоих ваших приложений.

Дополнительный бонус: поскольку WebDav является указанным протоколом, вы бесплатно получаете возможность взаимодействия с множеством инструментов.

Во-первых, вы уверены, что хотите написать свой собственный кеш, когда их несколько? Вещи как:

Первые два написаны на Java, а к третьему можно получить доступ из Java. Первые два также обрабатывают распределенное кеширование, что, я думаю, является общим случаем того, о чем вы просите. При запуске они стремятся подключиться к другим участникам, чтобы поддерживать согласованный кеш во всех экземплярах. Изменения одного отражаются во всех экземплярах. Их можно настроить для подключения через многоадресную рассылку или с указанием определенных списков серверов.

Memcached обычно работает немного по-другому, поскольку он выполняется вне запущенных вами процессов Java, так что все запускаемые экземпляры Java будут взаимодействовать с общей службой. Вы можете настроить memcached для работы в распределенном режиме, но это делается с помощью ключей хеширования, так что сервер, к которому вы хотите подключиться, можно определить по тому, что вы ищете.

Очень сложно создать настоящий распределенный кеш с согласованным содержимым, поэтому я предлагаю взглянуть на существующую библиотеку. Если вы хотите сделать это самостоятельно, все равно будет полезно взглянуть на перечисленные, чтобы увидеть, как они это делают, и подумать об использовании чего-то вроде JGroups в качестве основного механизма.

Другие вопросы по теме