我们正在使用Spring Session(备份关键Gemfire)来运行在分布式环境中运行的Spring Boot应用程序。
在这样的分布式环境中,
Spring会话确保将唯一会话ID用于new 跨不同JVM创建的会话?
答案 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唯一性问题与底层的后备数据存储无关。
希望这会有所帮助......
干杯!