【发布时间】:2016-01-04 10:22:08
【问题描述】:
我们正在为在分布式环境中运行的 Spring Boot 应用程序使用 Spring Session(由关键的 Gemfire 备份)。
在这样的分布式环境中,
Spring Session 是否确保一个唯一的 session id 用于新的 跨不同 JVM 创建会话?
【问题讨论】:
标签: spring session spring-session
我们正在为在分布式环境中运行的 Spring Boot 应用程序使用 Spring Session(由关键的 Gemfire 备份)。
在这样的分布式环境中,
Spring Session 是否确保一个唯一的 session id 用于新的 跨不同 JVM 创建会话?
【问题讨论】:
标签: spring session spring-session
只是查看旧的 SO 帖子以获得 Spring Session Pivotal GemFire 支持,所以我很抱歉您的问题没有得到及时的回答。
简而言之,Spring Session 使用 UUID 类来生成“唯一”会话 ID。例如,请参阅here,或更一般地,here。
注意:Spring Session Data Redis 默认支持uses/wraps MapSession 类在 Redis 中存储 Session 状态。
关于UUID 在集群中跨 JVM 的有效性,或者更确切地说是唯一性,似乎有很多 discussion。这个one in particular 虽然过时了,但引起了我的注意,因为它来自 Oracle Java 社区论坛。
但是,请记住,最终确定 Session ID 是否唯一的是您的应用程序对 Spring Session 的使用;即它不依赖于 GemFire 集群中的节点数量,因为单个 GemFire 节点不会生成 Session ID(使用 Spring Session 的应用程序是)。
因此,如果在使用 Spring Session 的情况下只有 1 个应用程序(可能不太可能处于世界的微服务状态),那么 UUID 就可能保证是唯一的。即便如此,基于可用的references,使用 Spring Session 的 2 个或更多“应用程序”节点似乎极不可能生成冲突的 ID(尽管,(几乎?)一切皆有可能 ;-)。
不过,我想如果它是最重要的关注点/重要性,遵循 Spring 的美丽传统,扩展 GemFireOperationsSessionRepository 将是一件简单的事情并覆盖createSession() 方法,调用适当的GemFireSession constructor 以传入所需的会话ID。
但是,在所有情况下(GemFire、Redis 等),会话 ID 唯一性问题与底层支持数据存储无关。
希望这会有所帮助...
干杯!
【讨论】: