Я пишу библиотеку HTTP Cache для Java, и я пытаюсь использовать эту библиотеку в том же приложении, которое запускается дважды. Я хочу иметь возможность разделять кеш между этими экземплярами.
Какое для этого лучшее решение? Я также хочу иметь возможность писать в то же хранилище, и оно должно быть доступно для обоих экземпляров.
Теперь у меня есть основанный на памяти индекс файлов, доступных для кеша, и он не может использоваться на нескольких виртуальных машинах. Он сериализуется между запусками, но это не сработает для общего кеша.
Согласно спецификации HTTP, я не могу просто сопоставить файлы с URI, так как в зависимости от запроса может быть вариант одной и той же полезной нагрузки. Например, у меня может быть запрос, который зависит от заголовка accept-language: в этом случае у меня будет другой файл для каждого последующего запроса, который указывает другой язык.
Есть идеи?




Я думаю, вам стоит взглянуть на WebDav-Технические характеристики. Это расширение HTTP для совместного использования / редактирования / хранения / управления версиями ресурсов на сервере. Существует реализация как Модуль Apache, которая позволяет быстро начать их использовать.
Поэтому вместо реализации собственной реализации кэш-сервера вам может быть лучше использовать локальный экземпляр Apache + mod-dav, доступный для обоих ваших приложений.
Дополнительный бонус: поскольку WebDav является указанным протоколом, вы бесплатно получаете возможность взаимодействия с множеством инструментов.
Во-первых, вы уверены, что хотите написать свой собственный кеш, когда их несколько? Вещи как:
Первые два написаны на Java, а к третьему можно получить доступ из Java. Первые два также обрабатывают распределенное кеширование, что, я думаю, является общим случаем того, о чем вы просите. При запуске они стремятся подключиться к другим участникам, чтобы поддерживать согласованный кеш во всех экземплярах. Изменения одного отражаются во всех экземплярах. Их можно настроить для подключения через многоадресную рассылку или с указанием определенных списков серверов.
Memcached обычно работает немного по-другому, поскольку он выполняется вне запущенных вами процессов Java, так что все запускаемые экземпляры Java будут взаимодействовать с общей службой. Вы можете настроить memcached для работы в распределенном режиме, но это делается с помощью ключей хеширования, так что сервер, к которому вы хотите подключиться, можно определить по тому, что вы ищете.
Очень сложно создать настоящий распределенный кеш с согласованным содержимым, поэтому я предлагаю взглянуть на существующую библиотеку. Если вы хотите сделать это самостоятельно, все равно будет полезно взглянуть на перечисленные, чтобы увидеть, как они это делают, и подумать об использовании чего-то вроде JGroups в качестве основного механизма.