Простая, быстрая и распределенная встраиваемая библиотека кэширования Java с открытым исходным кодом

Мне нужно сохранить состояние сеанса для веб-приложения, развернутого на нескольких серверах. Я хочу избежать липких сеансов или выполнения репликации сеансов, поскольку я хочу, чтобы приложение было автономным и не зависело от конкретных конфигураций контейнера сервлета.

Таким образом, логически единственный оставшийся вариант - управлять сеансом где-то еще, и логическое направление - с базой данных, которую совместно используют все серверы. Но это станет узким местом (и единственной точкой отказа), плюс реляционная база данных на самом деле не предназначена для хранения данных сеанса. Распределенное решение NoSQL было бы лучшим выбором, но все же это будет еще один компонент, которым нужно управлять.

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

Hazelcast кажется хорошим выбором, но мне просто нужна карта без каких-либо других функций Hazelcast, поэтому кажется, что это слишком много для распределенного контейнера пар ключ-значение.

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

Любые идеи?

Я использовал EHCache, но думаю, что он не легче Hazelcast...
@Nicolas Raoul: Спасибо за предложение, но я ищу библиотеку с открытым исходным кодом (я обновил свой вопрос). Насколько я знаю, под распространяемым EHCache подразумеваются Terracotta и BigMemory Max, которые являются лицензионными.
«Terracotta активно разрабатывает, поддерживает и поддерживает Ehcache как профессиональный проект с открытым исходным кодом, доступный по лицензии Apache 2». ehcache.org
@ Николас Рауль: я не это имел в виду. Насколько я понимаю, распределенные возможности EHCache недоступны в дистрибутиве с открытым исходным кодом, например, ehcache.org/documentation/get-started/about-distributed-cache . Я ошибаюсь?
EHCache встроен в продукт Alfresco с открытым исходным кодом и обеспечивает функции распределенного кэширования. Поэтому я почти уверен, что распределенные возможности EHCache доступны и в дистрибутиве с открытым исходным кодом. Эта страница вводит в заблуждение, я бы сказал, что они изо всех сил пытаются продать версию с закрытым исходным кодом.
хейзелкаст хорош. но я понятия не имею о механизме сохранения: stackoverflow.com/questions/25621860/…
@NicolasRaoul, у вас есть ссылка на документацию об этой функции? Это в ehcache 2 и будет ли в 3?
@Karussell: извините, я не помню подробностей :-/

Ответы (2)

Кэши Ehcache и Guava — довольно популярные и полезные внутрипроцессные кеши. Если возможно использование внешнего процесса для кеша, Memcached и Redis хорошо подходят для этой цели.

Насколько я знаю, Guava Cache не распространяется. Redis — это решение NoSQL, написанное на C, и его нельзя встроить в приложение Java (вы можете встроить клиент java, но не установку Redis), в то время как Memcached не работает так, как я хочу (чтобы иметь одинаковые данные на всех узлы, т.е. репликация).

Полное раскрытие: я работаю в Alachisoft.

Вы можете проверить NCache для .Net или TayzGrid для распределенного кеша Java . Оба проекта с открытым исходным кодом.

Ваше требование получить;

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

Это то, что они оба бесплатно предоставляют. Используйте его для того, для чего он вам нужен, и исключите другие функции.

Краткий обзор кода из связанного блога

import com.alachisoft.TayzGrid.web.caching.Cache;
    import com.alachisoft.TayzGrid.runtime.*;

    public class MyCachingSample {
        private String url = "dbc:msql://20.200.20.1:1114/MyDatabase";


        public Employee GetEmployee(String empId) throws Exception {
            Employee emp = null;
            try {
                Cache cache = TayzGrid.initializeCache("MyDistributedCache");
                emp = (Employee) cache.get(empId);
                //If key not found in cache, Load from the database
                if (emp == null) {
                    //Your logic goes here
                    ResultSet rs = stmt.executeQuery("SELECT * FROM Employee WHERE EmpId ='" + empId + "'");
                    if (rs.next()) {
                        emp = new Employee();
                        emp.EmpId = rs.getString("EmpId");

                        //Cache key for future use
                        cache.insert(empId, emp, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default);
                    }
                }
            } catch (Exception exp) {
                throw exp;
            }
            //return the required object
            return emp;
        }
    }

Однако вам придется написать для себя простого поставщика сеансов для поддержки закрепленных сеансов, или вы можете купить NCache или TayzGrid, чтобы получить эти функции. TayzGrid или NCache также могут использоваться и используются либо как распределенный кэш, либо как In-Memory Data Grid, а иногда как In-Memory Key Value Store. Это полностью зависит от ваших потребностей.

Если вам нужна поддержка или вы планируете использовать ее для предприятия, вы всегда можете получить платные лицензии. Это более многофункциональная версия и обеспечивает поддержку. У нас более 10 лет опыта работы в отрасли, поэтому он стабилен для полной производственной среды.