天天看点

Ignite 保存web session1.概述2. Architecture (架构)3.Replication Strategies(复制策略)4.Expiration and Eviction(过期和回收)5. Configuration6.Supported Containers

1.概述

启动内存数据结构可以缓存遵循Java Servlet 3.0规范的所有Java Servlet容器的web会话,包括Apache Tomcat、Eclipse Jetty、Oracle WebLogic等。

当我们以集群的方式运行我们的app服务端,那么这时,回话session的缓存就变得很有用了。当在servlet容器中运行web应用程序时,您可能会遇到性能和可伸缩性问题。单个应用服务器通常无法处理大量的流量。一个常见的解决方案是跨多个集群实例扩展web应用程序:

Ignite 保存web session1.概述2. Architecture (架构)3.Replication Strategies(复制策略)4.Expiration and Eviction(过期和回收)5. Configuration6.Supported Containers

在上面的架构中所示,高可用性代理(负载均衡器)在多个应用程序服务器实例(App Server 1,App Server 2,…)之间分配请求,减少每个实例的负载,并提供服务可用性,如果有任何实例失败的话。这里的问题是web会话可用性。web会话使用cookie在请求之间保持中间的逻辑状态,并且通常绑定到特定的应用程序实例。一般来说,这是通过使用粘性连接来处理的,确保来自同一用户的请求是由同一个应用程序服务器实例处理的。但是,如果该实例失败,会话将丢失,用户将不得不重新创建它,并随之会丢掉所有当前未保存的状态:

Ignite 保存web session1.概述2. Architecture (架构)3.Replication Strategies(复制策略)4.Expiration and Eviction(过期和回收)5. Configuration6.Supported Containers

这里的解决方案是使用启动内存数据Fabric web会话缓存——一个分布式缓存,它维护每个创建的会话的副本,并在所有实例之间共享它们。如果您的任何一个应用程序实例失败,ignite将自动恢复由失败的实例所拥有的会话,无论下一个请求将被转发到哪个应用服务器,它都来自分布式缓存。此外,随着会话在web请求可能被路由到的任何应用服务器上都可用,web会话缓存连接变得不那么重要。

Ignite 保存web session1.概述2. Architecture (架构)3.Replication Strategies(复制策略)4.Expiration and Eviction(过期和回收)5. Configuration6.Supported Containers

在本章中,我们将简要介绍ignite的web会话缓存功能以及如何配置web应用程序以启用web会话缓存的说明。

2. Architecture (架构)

要以ignite设置一个分布式web会话缓存,您通常会配置web应用程序来启动ignite节点(嵌入式模式)。当启动多个应用程序服务器实例时,所有的启动节点都与其他节点连接,从而形成分布式缓存。

PS:请注意,并不是每一个ignite缓存节点都必须运行在应用服务器内部。您还可以启动额外的、独立的点ignite点,并将它们添加到拓扑中。

3.Replication Strategies(复制策略)

在将会话存储在内存中的数据结构时,可以使用多种复制策略。复制策略由支持缓存设置定义。在本节中,我们将简要介绍最常见的配置。

3.1 Fully Replicated Cache

这个策略在每个ignite节点上存储所有会话的副本,提供最大可用性。然而,使用这种方法,您只能在单个服务器上缓存尽可能多的web会话。此外,随着web会话状态的每一次更改都必须被复制到所有其他集群节点,性能可能会受到影响。

要启用完全复制的策略,请将备份缓存的cacheMode设置为复制【REPLICATED】:

<bean class="org.apache.ignite.configuration.CacheConfiguration">
    <!-- Cache mode. -->
    <property name="cacheMode" value="REPLICATED"/>
    ...
</bean>
           

3.2 Partitioned Cache with Backups

在分区模式中,web会话分散到分区里,每个节点负责只缓存分配给该节点的分区。使用这种方法,您拥有的节点越多,可以缓存的数据越多。为了添加更多的内存,总是可以添加新节点。

PS:在分区模式下,通过为缓存的每个web会话配置备份数量来解决冗余。

为了启用分区策略,设置您的支持缓存的cacheMode为PARTITIONED,并将备份属性设置为CacheConfiguration的backups 属性来设置备份的数量:

<bean class="org.apache.ignite.configuration.CacheConfiguration">
    <!-- Cache mode. -->
    <property name="cacheMode" value="PARTITIONED"/>
    <property name="backups" value="1"/>
</bean>
           

PS:请参阅缓存分发模型以获取更多关于在点火时可用的不同复制策略的信息。

4.Expiration and Eviction(过期和回收)

陈旧的会话在过期时自动从缓存中清除。但是,如果创建了许多长时间的会话,您可能希望通过在缓存达到一定的限度时从缓存中清除不必要的会话来保存内存。这可以通过设置缓存清除策略和指定存储在缓存中的会话的最大数量来完成。例如,为了启用LRU算法的自动清除和10000个会话的限制,您需要使用以下缓存配置:

<bean class="org.apache.ignite.configuration.CacheConfiguration">
    <!-- Cache name. -->
    <property name="name" value="session-cache"/>
 
    <!-- Set up LRU eviction policy with 10000 sessions limit. -->
    <property name="evictionPolicy">
        <bean class="org.apache.ignite.cache.eviction.lru.LruEvictionPolicy">
           <property name="maxSize" value="10000"/>
        </bean>
    </property>
    ...
</bean>
           

5. Configuration

为了在您的应用程序中启用web会话缓存,您需要:

  1. Add Ignite JARs:下载ignite,并将以下jar添加到应用程序的classpath(WEB_INF/libs文件夹):

    >ignite.jar

    >ignite-web.jar

    >ignite-log4j.jar

    >ignite-spring.jar

    或者,如果您有一个基于Maven的项目,则在应用程序的pom.xml中添加以下内容。

<dependency>
      <groupId>org.apache.ignite</groupId>
      <artifactId>ignite-core</artifactId>
      <version> ${ignite.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.ignite</groupId>
    <artifactId>ignite-web</artifactId>
    <version> ${ignite.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.ignite</groupId>
    <artifactId>ignite-log4j</artifactId>
    <version>${ignite.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.ignite</groupId>
    <artifactId>ignite-spring</artifactId>
    <version>${ignite.version}</version>
</dependency>
           

版本号设置真实的~~

  1. Configure Cache Mode:在分区或复制模式中配置ignite缓存(参见上面的例子)。
  2. Update web.xml:在web . xml中声明上下文侦听器和web会话过滤器。
...

<listener>
   <listener-class>org.apache.ignite.startup.servlet.ServletContextListenerStartup</listener-class>
</listener>

<filter>
   <filter-name>IgniteWebSessionsFilter</filter-name>
   <filter-class>org.apache.ignite.cache.websession.WebSessionFilter</filter-class>
</filter>

<!-- You can also specify a custom URL pattern. -->
<filter-mapping>
   <filter-name>IgniteWebSessionsFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

<!-- Specify Ignite configuration (relative to META-INF folder or Ignite_HOME). -->
<context-param>
   <param-name>IgniteConfigurationFilePath</param-name>
   <param-value>config/default-config.xml </param-value>
</context-param>

<!-- Specify the name of Ignite cache for web sessions. -->
<context-param>
   <param-name>IgniteWebSessionsCacheName</param-name>
   <param-value>partitioned</param-value>
</context-param>

...
           

在应用程序启动时,侦听器将在应用程序内启动一个点火节点,该节点将连接到网络中的其他节点,形成分布式缓存。

  1. Set Eviction Policy (Optional):将过期的web会话数据的清除策略设置为缓存(参见上面的例子)。

5.1 Configuration Parameters

ServletContextListenerStartup具有以下配置参数:

参数名字 描述 默认值
IgniteConfigurationFilePath 启动配置文件的路径(相对于META_INF文件夹或IGNITE_HOME)。 /config/default-config.xml

WebSessionFilter有以下配置参数:

参数名字 描述 默认值
IgniteWebSessionsGridName 启动ignite节点的网格名称。应该在配置文件中引用网格(如果在配置中指定了网格名称) null
IgniteWebSessionsCacheName 只对原子缓存有效。在主节点故障时指定重试次数。 null
zebra stripes are neat $1

6.Supported Containers

ignite已经通过以下servlet容器正式测试:

  • Apache Tomcat 7
  • Eclipse Jetty 9
  • Apache Tomcat 6
  • Oracle WebLogic >= 10.3.4