【发布时间】:2020-08-12 09:27:30
【问题描述】:
我们在负载均衡器后面有一个应用程序,它只支持循环,没有粘性会话。
Spring Boot 应用程序在 OpenShift 集群中运行,部署中有许多 pod。我们至少有两个 pod,但可能会根据负载将其扩展到 10 或 20 个。
应用程序使用 Spring Session 和 Spring Security。 Spring Session 被配置为使用 MongoDB(而不是 Redis),因为应用程序已经将 MongoDB 用于其他目的。
在低到中等负载的功能测试期间,我们注意到会话属性“丢失”的问题:更新这些条目的代码运行成功,但在请求完成后,属性的旧内容在会话中.这是随机发生的。
使用应用程序的单个实例进行测试,没有进行此类观察。
对我来说,这听起来像是会话对象回写到 Mongo 之间的竞争条件,一个 pod 上的一些 HTTP 请求与另一个 pod 中的回写竞争,而“错误的”获胜。
- 这是 Spring Session with MongoDB 的有效使用场景吗?换句话说,这应该有效吗?
- 如果它应该工作,我怎样才能知道发生了什么,我可以做些什么来解决这个问题?
- 如果它不应该工作,是否有一个 Spring Session 设置允许跨应用程序服务器共享会话状态而没有竞争条件?
【问题讨论】:
-
这可能与读/写仲裁有关吗?复制中有一些延迟?我们所说的 MongoDB 是什么? MongoDB应该可以很好地托管会话,尽管 replset 或 clusters 可能不是最好的用例 - 那么,redis 确实是一个很好的选择,可以很容易地部署在 OpenShift 中
标签: java mongodb spring-boot spring-session