Hazelcast Predicate在重载期间卡住了

问题描述 投票:0回答:1

我有一个双节点Hazelcast集群,每个集群大小为6 GB。我有一个在四个字段上运行的谓词,所以例如,我们考虑一个类Employee

  public class Employee {
  String id,
  String name,
  String surname,
  String timestamp
  .....
  }

该班总共有13个领域左右。我在时间戳上运行范围查询,并与其他3个字段 - id,name和surname绝对匹配。对于序列化,我使用IdentifiedDataSerializable,因为这是hazelcast提供的最有效的序列化形式。我有一个tomcat servlet容器设置,所以每个请求都会在集群上触发谓词。我目前面临的问题是当集群中有大约100,000条记录并且我在tomcat容器上进行性能测试时,大多数tomcat线程都会因为谓词查询永远不会返回而卡住。我查看了hazelcast提供的线程模型 - https://docs.hazelcast.org/docs/latest-dev/manual/html-single/index.html#threading-model。我使用文档中的属性修改了不同类型的线程,它改进了一些东西,但它基本上是在黑暗中开火。我在字段id上添加了一个索引,但这也没有真正改进。

如果有人指出我如何解决这个问题,我真的很感激。先感谢您!

编辑 -

用于集群和客户端的Hazelcast版本为3.9。此外,我使用hazelcast嵌入在spring启动应用程序中。不要以为会产生一些影响,但想让大家都知道。

java hazelcast hazelcast-imap
1个回答
1
投票

@ Indraneel-Bende,一些建议:

  1. Hazelcast查询引擎评估所有谓词并组合结果。如果它是AND谓词,在检索到所有4个Predicate结果后,将选择所有4个结果中的常见结果。因此,如果这些字段中的任何一个具有较低的基数并返回太多结果,则会降低谓词的速度。因此,我建议仅在1个具有最高基数的字段上定义索引,或者最多2个字段。
  2. 由于并非所有字段都将被编入索引,因此需要对从索引存储返回的条目进行反序列化以应用非索引谓词。即使使用IdentifiedDataSerializable,如果你有太多的字段,你每次都要支付全部的反序列化费用。相反,您可以实现Portable序列化。虽然存储的条目大小会更大,但这样Hazelcast成员可以反序列化您在这些谓词中使用的字段,并且它将加快查询速度。
  3. 如此处所述,https://docs.hazelcast.org/docs/3.9/manual/html-single/index.html#copying-indexes,索引结果被复制以确保结果正确,尤其是新节点加入/离开集群。如果您确定会员资格不会改变,您可以将hazelcast.index.copy.behavior设置为NEVER。这也将加快查询速度。

我个人建议逐一测试它们。我的第一个建议肯定会提高查​​询速度。如果您需要进一步的表现,请尝试第二种方法并查看差异。如果您的成员资格在查询时发生变化,最后一个会导致错误或重复的结果,我会谨慎使用它。

© www.soinside.com 2019 - 2024. All rights reserved.