gpt4 book ai didi

java - Hazelcast 谓词在重负载期间卡住

转载 作者:行者123 更新时间:2023-12-02 10:17:09 25 4
gpt4 key购买 nike

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

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

该类总共有大约 13 个字段。我正在对时间戳运行范围查询,并与其他 3 个字段( id 、 name 和 surname )进行绝对匹配。对于序列化,我使用 IdentifiedDataSerialized,因为这是 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 Boot 应用程序中。我认为这不会产生任何影响,但想让大家知道。

最佳答案

@Indraneel-Bende,一些建议:

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

我个人建议一一测试。我的第一个建议肯定会提高查​​询速度。如果您需要更高的性能,请尝试第二种方法并查看差异。由于如果您的成员资格在查询时发生更改,最后一个可能会导致错误或重复的结果,因此我会谨慎使用它。

关于java - Hazelcast 谓词在重负载期间卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54606534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com