Java Spring会话惰性反序列化

Java Spring会话惰性反序列化,java,hazelcast,spring-session,Java,Hazelcast,Spring Session,我有以下情况,我有一个带有api网关和多个下游服务的微服务体系结构,其中一些具有独立会话,这导致我的系统在随机服务调用上抛出过期会话异常 因为我们不能从头重写这些服务,所以我们从引入hazelcast开始,这样所有服务都可以共享同一个会话 现在的问题是,当一个服务写入一个类的对象,而其他服务的类路径中没有该对象时,就会引发反序列化异常 为了解决这个问题,我想,如果只有从服务访问的属性被反序列化,我可能会避免异常,并且一切都会正常工作 你知道这在spring会话中是否可行,或者你可以建议另一种解决

我有以下情况,我有一个带有api网关和多个下游服务的微服务体系结构,其中一些具有独立会话,这导致我的系统在随机服务调用上抛出过期会话异常

因为我们不能从头重写这些服务,所以我们从引入hazelcast开始,这样所有服务都可以共享同一个会话

现在的问题是,当一个服务写入一个类的对象,而其他服务的类路径中没有该对象时,就会引发反序列化异常

为了解决这个问题,我想,如果只有从服务访问的属性被反序列化,我可能会避免异常,并且一切都会正常工作

你知道这在spring会话中是否可行,或者你可以建议另一种解决方案,让我解决最初的问题吗


下面是一个重现我的问题的示例项目:

我相信我了解了发生的情况:Spring会话Hazelcast默认情况下存储会话在本地更新,直到请求完成&当请求完成时,在返回响应之前,使用
EntryProcessor
将所有内容发送到集群
EntryProcessor
要求存储该会话记录的成员上有可用的对象类,并且由于数据是分布式的,因此可能有其他成员存储在另一个实例中创建的会话。根据您所说的,并非所有节点都相同,不包含所有类&这会导致序列化异常

您可以使用
用户代码部署
功能将缺少的类部署到其他成员:

如果要更改存储在会话中的对象,可以将
类缓存模式
设置为
关闭
,以防止不缓存它们,而是在每次操作时发送


请尝试并让我知道这是否解决了您的问题。

首先,我会尝试避免API层中的会话。它们的规模很小。同步会话的可伸缩性甚至更低

尝试改用访问令牌,例如。令牌应包含足够的用户标识信息,以加载处理事务所需的资源(可以缓存资源)


至于会话中的另一种状态,从流程的角度来看,微服务是自包含的,因此所有中间结果都应该持久化到数据库中。当然,我不知道您的特定应用程序的详细信息,所以这只是一个一般性的想法。

如果您访问整个会话或会话中的特定值,您应该会看到这个问题。是这样吗?在第二次检查中,Spring似乎在每次请求时都通过id访问整个会话。我插入对象后立即看到反序列化异常,hazelcast似乎试图尽快更新,明天如果有人想尝试,我可以提供一个示例项目,这真的很有帮助。使用一种不同的序列化策略-一些不涉及Java序列化的策略(不仅仅是因为它很慢,很笨重,而且像你所学的那样非常脆弱)。例如,序列化为JSON并忽略未知属性。更好的办法是使用一个真正的方案,如Avro或Protobuf.TL,为向后和向前兼容性而设计;DR:停止尝试破解一个简单的解决方案,实际做一些工程。这看起来很有趣,我明天会试试——这听起来是一个很好的方法,可以同时导致可怕的类加载器问题和可怕的性能问题!你知道为每个实例发送类的成本吗?这个解决方案在我的示例中是有效的,我在分支上推了这个:用户代码-deployment@BoristheSpider是的,你说得对。这就是为什么我说如果要更改类,那么可以禁用缓存。davide buzz似乎启用了加载类的缓存。我同意你的观点,对于较新的服务,我们已经按照你的建议进行了缓存,但是对于遗留服务,需要进行大规模重构才能改变它们使用会话的方式。如果我能找到一个更快的解决方案,而不是慢慢开始重构那些遗留服务的过程