1

我们目前正在将 Apache Ignite 集成到我们的应用程序中以在集群中共享会话。

此时,我们可以成功地在两个本地 tomcat 实例之间共享会话,但是有一个用例,目前还不能正常工作。

当使用完全相同的代码运行两个本地实例时,一切都很好。但是当 Ignite 逻辑集成到我们的生产集群中时,我们会遇到以下用例:

  1. 节点 1节点 2,运行应用程序的版本 1
  2. 此时我们要部署应用程序的第 2 版
  3. Tomcat 在节点 1停止,部署版本 2,并在部署结束时再次启动节点 1的 Tomcat。
  4. 我们现在有Node 1版本 2的代码和Node 2,仍然是版本 1
  5. Tomcat 在节点 2停止,部署版本 2,并在部署结束时再次启动节点 2的 Tomcat。
  6. 我们现在有Node 1版本 2的代码和Node 2版本 2
  7. 部署完成

当在同一网格中使用两个 tomcat 实例在本地重现此用例时,Ignite Web 会话集群会失败。我测试的是删除驻留在用户会话中的类(配置文件)的一个“字符串属性”。使用此更改的类启动节点 1时,出现以下异常:

Caused by: java.lang.ClassNotFoundException: 
Optimized stream class checksum mismatch 
(is same version of marshalled class present on all nodes?) [expected=4981, actual=-27920, cls=class nl.package.profile.Profile]

这将是我们部署的常见/常规用例。我的问题是:如何处理这个用例?Ignite 中是否有解决/解决此类问题的方法?

4

1 回答 1

0

据我了解,您的用例非常适合 Ignite Binary 对象 [1]。此功能允许以无类格式存储对象并在运行时修改对象结构,而无需在更改对象版本时完全重新启动集群。

你的 Person 类应该实现 org.apache.ignite.binary.Binarylizable 接口,它可以让你完全控制序列化和反序列化逻辑。使用此接口,您甚至可以在集群中拥有两个节点,它们在反序列化和序列化时都使用不同版本的 Person 类,方法是仅从二进制格式读取/写入所需的字段。

[1] https://apacheignite.readme.io/docs/binary-marshaller

于 2016-02-09T14:11:19.787 回答