Spring 会话惰性反序列化
Spring session lazy deserialization
我有以下情况,我有一个带有 api 网关和多个下游服务的微服务架构,其中一些有一个独立的会话,这导致我的系统在随机服务调用时抛出过期会话异常.
由于我们无法从头开始重写这些服务,因此我们首先引入了 hazelcast,以便所有服务可以共享同一个会话。
现在的问题是,当一个服务写入一个 class 的对象时,其他服务的 class 路径中没有该对象,则会引发反序列化异常。
为了解决这个问题,我在想如果只有从服务访问的属性被反序列化,我可能可以避免异常,一切都应该正常工作。
您是否知道 spring 会话是否完全可行,或者可以建议另一种解决方案来解决最初的问题?
这里有一个重现我的问题的示例项目:https://github.com/deathcoder/hazelcast-shared-session
我相信我知道发生了什么:Spring-Session-Hazelcast 默认情况下在本地存储会话更新,直到请求完成,当请求完成时,在返回响应之前,使用 [=10= 将所有内容发送到集群]. EntryProcessor
要求对象 类 在存储该会话记录的成员上可用,并且由于数据是分布式的,其他成员可能存储在另一个实例中创建的会话。根据您的说法,并非所有节点都相同,不包含所有 类 & 这会导致序列化异常。
你可以做什么,你可以使用 User Code Deployment
功能将缺少的 类 部署到其他成员:https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#member-user-code-deployment-beta
如果您正在更改存储在会话中的对象,您可以将 class-cache-mode
设置为 OFF
以防止不缓存它们而是在每次操作时发送它们。
如果这能解决您的问题,请尝试告诉我。
我会首先尝试避免 API 层中的会话。它们的扩展性很差。同步会话的可扩展性更差。
尝试使用访问令牌,例如JWT token。令牌应包含足够的用户身份信息以加载处理交易所需的资源(可以缓存资源)。
至于会话中的其他状态——从流程的角度来看,微服务是自包含的,因此所有中间结果都应该持久化到数据库中。但是我当然不知道你具体应用的细节,所以这只是一个大概的想法。
我有以下情况,我有一个带有 api 网关和多个下游服务的微服务架构,其中一些有一个独立的会话,这导致我的系统在随机服务调用时抛出过期会话异常.
由于我们无法从头开始重写这些服务,因此我们首先引入了 hazelcast,以便所有服务可以共享同一个会话。
现在的问题是,当一个服务写入一个 class 的对象时,其他服务的 class 路径中没有该对象,则会引发反序列化异常。
为了解决这个问题,我在想如果只有从服务访问的属性被反序列化,我可能可以避免异常,一切都应该正常工作。
您是否知道 spring 会话是否完全可行,或者可以建议另一种解决方案来解决最初的问题?
这里有一个重现我的问题的示例项目:https://github.com/deathcoder/hazelcast-shared-session
我相信我知道发生了什么:Spring-Session-Hazelcast 默认情况下在本地存储会话更新,直到请求完成,当请求完成时,在返回响应之前,使用 [=10= 将所有内容发送到集群]. EntryProcessor
要求对象 类 在存储该会话记录的成员上可用,并且由于数据是分布式的,其他成员可能存储在另一个实例中创建的会话。根据您的说法,并非所有节点都相同,不包含所有 类 & 这会导致序列化异常。
你可以做什么,你可以使用 User Code Deployment
功能将缺少的 类 部署到其他成员:https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#member-user-code-deployment-beta
如果您正在更改存储在会话中的对象,您可以将 class-cache-mode
设置为 OFF
以防止不缓存它们而是在每次操作时发送它们。
如果这能解决您的问题,请尝试告诉我。
我会首先尝试避免 API 层中的会话。它们的扩展性很差。同步会话的可扩展性更差。
尝试使用访问令牌,例如JWT token。令牌应包含足够的用户身份信息以加载处理交易所需的资源(可以缓存资源)。
至于会话中的其他状态——从流程的角度来看,微服务是自包含的,因此所有中间结果都应该持久化到数据库中。但是我当然不知道你具体应用的细节,所以这只是一个大概的想法。