在活动的Apache Ignite网格

时间:2016-02-09 09:11:25

标签: ignite

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

此时我们可以成功地在两个本地tomcat实例之间共享会话,但是有一个用例,到目前为止还没有用。

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

  1. 节点1 节点2 ,运行应用程序的版本1
  2. 此时我们要部署应用程序的版本2
  3. Tomcat停在节点1 版本2 ,并且在部署结束时,节点1 的Tomcat再次启动
  4. 我们现在节点1 版本2 代码节点2 ,仍然版本1
  5. Tomcat在节点2 停止,版本2 已部署,在部署结束时,节点2 上的Tomcat再次启动
  6. 我们现在节点1 版本2 代码节点2 版本2 < / LI>
  7. 部署已完成
  8. 当在同一网格中使用两个tomcat实例在本地再现此用例时,Ignite Web会话群集将失败。我测试的是删除一个&#39; String属性&#39;属于用户会话的类(配置文件)。使用此更改的类启动节点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有办法解决/解决这类问题吗?

1 个答案:

答案 0 :(得分:0)

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

您的Person类应该实现org.apache.ignite.binary.Binarylizable接口,它将为您提供对序列化和反序列化逻辑的完全控制。使用此接口,您甚至可以在集群中有两个节点,在反序列化和放大时使用不同版本的Person类。通过从/向二进制格式读取/写入所需字段的序列化时间。

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