Cassandra:在超级列上设置TTL

时间:2014-07-11 09:01:07

标签: java session tomcat cassandra ttl

我为Tomcat开发了一个插件,允许会话数据持久化并分布在Cassandra环上。我希望Cassandra使用各列上的TTL设置来处理会话到期。我现在遇到的问题是会话中的各种对象都会在不同的时间到期,因此会话会随着时间的推移丢失未使用的对象 - 即使会话(和其他会话对象)被连续访问也是如此。

有没有办法可以在超级列上设置TTL,并且当密钥到期时,存储在此超级列中的密钥下的所有数据都会过期?

每次返回HTTP响应时,我都不想遍历Web会话中存储的所有数据,因为这会在tomcat插件和Cassandra之间产生不必要的I / O.我也不想在Tomcat插件中保留任何内存缓存,因为我希望Tomcat完全无状态并且完全在Cassandra中维护所有用户会话状态。

这个Tomcat插件非常漂亮,因为它允许以前阶段性的Web应用程序变为无状态 - 从而允许水平扩展。克服这个TTL问题真是太棒了......

https://code.google.com/a/apache-extras.org/p/tomcat-cassandra/

1 个答案:

答案 0 :(得分:0)

我最近一直在考虑这个问题,并且没有使用内置列ttl的简单解决方案,而不会在每个请求上产生明显的i / o。我建议不要完全依赖列ttl。

  1. 创建会话时,请创建一个额外的 expiration_timestamp 列,并将其设置为合理的值,例如60分钟后到期的时间戳。
  2.   

    session_key,value1,value2, expiration_timestamp = 60分钟

    1. 插入列(value1,value2等..)时,将ttl设置为60分钟。 (可以在http请求期间动态添加列,因此,最初它们将在不同时间到期)

    2. 当用户执行http请求时,请读取会话行(通过行缓存,密钥缓存等进行优化),但不要更新ttl或expiration_timestamp。

    3. 当用户请求接近expiration_timestamp时,例如50分钟,更新expiration_timestamp(再添加60分钟),并使用新的ttl重新插入整个会话行。(所有列ttl将同时更新同步)。
    4. 该解决方案确保我们在大多数时间(希望来自缓存)执行读取,并且仅在会话到期之前执行写入i / o(以保持会话活动,更新ttl)。并且"当"执行更新ttl是任意的,您可以将其设置为30分钟,50分钟,但不是每次访问。