Мне нужно сохранить состояние сеанса для веб-приложения, развернутого на нескольких серверах. Я хочу избежать липких сеансов или выполнения репликации сеансов, поскольку я хочу, чтобы приложение было автономным и не зависело от конкретных конфигураций контейнера сервлета.
Таким образом, логически единственный оставшийся вариант - управлять сеансом где-то еще, и логическое направление - с базой данных, которую совместно используют все серверы. Но это станет узким местом (и единственной точкой отказа), плюс реляционная база данных на самом деле не предназначена для хранения данных сеанса. Распределенное решение NoSQL было бы лучшим выбором, но все же это будет еще один компонент, которым нужно управлять.
Поэтому я подумал о быстрой и распределенной встраиваемой кэш-библиотеке Java, которая реплицирует данные по всем узлам, чтобы независимо от того, к какому серверу обращается клиент, иметь доступ к последнему состоянию.
Hazelcast кажется хорошим выбором, но мне просто нужна карта без каких-либо других функций Hazelcast, поэтому кажется, что это слишком много для распределенного контейнера пар ключ-значение.
Но кроме этого я не могу найти никакой другой библиотеки, которая бы удовлетворяла потребности. В идеале это должна быть библиотека с открытым исходным кодом, которую я могу свободно использовать в коммерческом продукте.
Любые идеи?
Полное раскрытие: я работаю в 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 лет опыта работы в отрасли, поэтому он стабилен для полной производственной среды.
Николя Рауль
ДжонДоДо
Николя Рауль
ДжонДоДо
Николя Рауль
Карусель
Карусель
Николя Рауль