gpt4 book ai didi

session - Wicket 集群 session 存储、页面存储、数据存储

转载 作者:行者123 更新时间:2023-12-04 22:38:33 25 4
gpt4 key购买 nike

我正在处理 wicket session 存储、数据存储、页面存储的自定义实现。我有 cu cluster wicket 并使其在以下情况下工作:

集群中有 2 个节点,节点 1 发生故障,用户应该能够在没有注意到的情况下继续流程,页面是有状态的,有很多 ajax 请求。现在,我将 wicket session 存储在 rmi 上的自定义存储中,并且我正在尝试扩展 DiskPageStore。新的挑战是 SessionEntry 内部类,它仍然由 ConcurrentMap 持有。

我的问题是:以前有人做过吗?您对如何完成此任务有任何建议吗?

最佳答案

我的建议是在您的情况下忘记 DiskPageStore 和 SessionEntry。您提到的 ConcurrentMap 保存在本地堆中。一旦其中一个节点发生故障,就无法访​​问其 ConcurrentMap,并且从 ConcurrentMap 引用的 Wicket 资源将无法释放。

因此,在集群环境中,您需要集群 Wicket 页面存储。页面版本可以根据某些策略过期,或者在相应 session 过期时故意删除。

我已经为生产中的企业 Web 应用程序中使用的 Apache Wicket 启用了 Web session 和数据存储集群,并且运行良好。我使用的软件是:

  • JDK 1.8.0_60
  • Apache Tomcat 8.0.33 (Tomcat 7 works too)
  • Wicket 6.16(版本 6.22.0 和 7.2.0 也应该可以使用)
  • Apache 点燃 1.7.0
  • 负载均衡器:Crossroads
  • Ubuntu 14.04.1

  • 这个想法是使用 Apache Ignite对于 Web session 集群,按照 Web Session Clustering 的说明操作非常简单。 .

    一旦我将 Web session 集群化,然后我将数据存储(已经包括页面存储)放入 Ignite 分布式数据网格,同时我禁用了 Wicket 应用程序范围缓存(以确保所有数据都是集群)。查看 Wicket's page store 上的文档了解如何配置数据存储。

    或者,您应该能够使用 Wicket HttpSessionDataStore 将数据存储放入 session 中。由于 session 是集群的,因此数据存储会自动集群。但对我来说,这种方法与 Apache Ignite 不兼容。所以我使用我自己实现的 IDataStore 接口(interface),它将数据存储放入 Ignite 分布式数据网格中。请参阅下面的实现。

    import java.util.concurrent.TimeUnit;
    import javax.cache.expiry.Duration;
    import javax.cache.expiry.TouchedExpiryPolicy;
    import org.apache.ignite.Ignite;
    import org.apache.ignite.IgniteCache;
    import org.apache.ignite.Ignition;
    import org.apache.ignite.cache.CacheMemoryMode;
    import org.apache.ignite.cache.CacheMode;
    import org.apache.ignite.cache.eviction.lru.LruEvictionPolicy;
    import org.apache.ignite.configuration.CacheConfiguration;
    import org.apache.wicket.pageStore.IDataStore;
    import org.apache.wicket.pageStore.memory.IDataStoreEvictionStrategy;
    import org.apache.wicket.pageStore.memory.PageTable;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    public class IgniteDataStore implements IDataStore {

    private static final Logger log = LoggerFactory.getLogger(IgniteDataStore.class);

    private final IDataStoreEvictionStrategy evictionStrategy;
    private Ignite ignite;
    IgniteCache<String, PageTable> igniteCache;

    public IgniteDataStore(IDataStoreEvictionStrategy evictionStrategy) {
    this.evictionStrategy = evictionStrategy;

    CacheConfiguration<String, PageTable> cacheCfg = new CacheConfiguration<String, PageTable>("wicket-data-store");
    cacheCfg.setCacheMode(CacheMode.PARTITIONED);
    cacheCfg.setBackups(1);

    cacheCfg.setMemoryMode(CacheMemoryMode.OFFHEAP_VALUES);
    cacheCfg.setOffHeapMaxMemory(2 * 1024L * 1024L * 1024L); // 2 Gigabytes.

    cacheCfg.setEvictionPolicy(new LruEvictionPolicy<String, PageTable>(10000));

    cacheCfg.setExpiryPolicyFactory(TouchedExpiryPolicy.factoryOf(new Duration(TimeUnit.SECONDS, 14400)));
    log.info("IgniteDataStore timeout is set to 14400 seconds.");

    ignite = Ignition.ignite();
    igniteCache = ignite.getOrCreateCache(cacheCfg);
    }

    @Override
    public synchronized byte[] getData(String sessionId, int id) {
    PageTable pageTable = getPageTable(sessionId, false);
    byte[] pageAsBytes = null;
    if (pageTable != null) {
    pageAsBytes = pageTable.getPage(id);
    }
    return pageAsBytes;
    }

    @Override
    public synchronized void removeData(String sessionId, int id) {
    PageTable pageTable = getPageTable(sessionId, false);
    if (pageTable != null) {
    pageTable.removePage(id);
    }
    }

    @Override
    public synchronized void removeData(String sessionId) {
    PageTable pageTable = getPageTable(sessionId, false);
    if (pageTable != null) {
    pageTable.clear();
    }
    igniteCache.remove(sessionId);
    }

    @Override
    public synchronized void storeData(String sessionId, int id, byte[] data) {
    PageTable pageTable = getPageTable(sessionId, true);
    if (pageTable != null) {
    pageTable.storePage(id, data);
    evictionStrategy.evict(pageTable);
    igniteCache.put(sessionId, pageTable);
    } else {
    log.error("Cannot store the data for page with id '{}' in session with id '{}'", id, sessionId);
    }
    }

    @Override
    public synchronized void destroy() {
    igniteCache.clear();
    }

    @Override
    public boolean isReplicated() {
    return true;
    }

    @Override
    public boolean canBeAsynchronous() {
    return false;
    }

    private PageTable getPageTable(String sessionId, boolean create) {
    if (igniteCache.containsKey(sessionId)) {
    return igniteCache.get(sessionId);
    }

    if (!create) {
    return null;
    }

    PageTable pageTable = new PageTable();
    igniteCache.put(sessionId, pageTable);
    return pageTable;
    }
    }

    希望能帮助到你。

    关于session - Wicket 集群 session 存储、页面存储、数据存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24991767/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com