分布式环境中会话ID的唯一性?

时间:2016-01-04 10:22:09

标签: spring session spring-session

我们正在使用Spring Session(备份关键Gemfire)来运行在分布式环境中运行的Spring Boot应用程序。

在这样的分布式环境中,

  

Spring会话确保将唯一会话ID用于new   跨不同JVM创建的会话?

1 个答案:

答案 0 :(得分:1)

只需查看 Spring Session Pivotal GemFire 支持的旧SO帖子,所以我很抱歉你的问题没有得到及时的答复。

简而言之, Spring Session 使用UUID类生成" unique"会话ID。例如,请参阅here,或更一般地说,here

注意:默认情况下, Spring会话数据Redis 支持uses/wraps MapSession类以在Redis中存储会话状态。

关于群集中JVM的UUID的有效性或相当独特性,似乎有很多discussion。这个one in particular虽然过时了但引起了我的注意,因为它起源于Oracle Java社区论坛。

但是,请记住,您的应用程序使用 Spring Session 最终会确定会话ID是否唯一;即它不依赖于GemFire集群中的节点数量,因为各个GemFire节点没有生成会话ID(使用 Spring Session 的应用程序是)。

因此,如果在使用 Spring Session 时只有1个应用程序(可能不太可能在微软服务状态下),那么UUID在概率上保证是唯一的。即便如此,基于可用的references,似乎不太可能有2个或更多的应用程序"使用Spring Session的节点将生成碰撞的ID(尽管,(几乎?)一切皆有可能; - )。

尽管如此,我认为如果它是最重要的关注/重要性,遵循 Spring 的美丽传统,扩展 {{1}将是一件简单的事情。并覆盖createSession()方法,调用相应的GemFireOperationsSessionRepository constructor来传递所需的会话ID。

但是,在所有情况下(GemFire,Redis等),会话ID唯一性问题与底层的后备数据存储无关。

希望这会有所帮助......

干杯!