【问题标题】:Spring Session Redis web session expiration notifications not delayed until application is up again?Spring Session Redis Web 会话到期通知不会延迟到应用程序再次启动?
【发布时间】:2021-11-19 14:10:07
【问题描述】:

目前在 Spring Boot 2.5 Web 应用程序中使用 Spring Session Redis。

应用程序正确接收来自 Redis 的 Web 会话到期通知,但 AFAIK仅当应用程序当时启动并运行时。似乎如果后端在那个时候停止(崩溃,计划维护,......),通知不会“保留”或“延迟”直到后端再次启动,它们只是丢失了。

https://redis.io/topics/notifications from “如果您的 Pub/Sub 客户端断开连接,然后重新连接,则在客户端断开连接期间传递的所有事件都将丢失” 我知道这是标准的 Redis行为。

这确实是当前的 Spring Session Redis 行为吗? 是否有推荐的解决方案来“延迟”通知?

【问题讨论】:

    标签: spring-boot redis spring-session


    【解决方案1】:

    正如您所提到的,这是 Redis Keyspace 通知的标准行为。

    如果某个key在应用宕机的时候过期,过期事件无法处理,无法延迟通知。

    在 Spring Session Data Redis 中的会话过期上下文中,这意味着如果在发送 Redis Keyspace 通知时应用程序关闭(崩溃等),SessionExpiredEvent/SessionDeletedEvent 将不会触发。
    如果您的任务依赖于这些事件,这将导致问题。
    这也意味着资源可能无法正确清理。

    但是,从安全的角度来看,会话仍然会正确过期,并且用户将无法继续使用过期的会话。

    如果应用程序在到期时执行一项关键任务,则考虑到 Redis Pub/Sub 的“即发即弃”性质,不同的数据存储可能更适合。
    或者,拥有多个节点会使它们在收到通知时不太可能全部关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-14
      • 2016-12-31
      • 2016-08-01
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 2019-01-14
      相关资源
      最近更新 更多