Hazelcast 谓词在重负载期间卡住

Hazelcast Predicate gets stuck during Heavy Load

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

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

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

如果有人能为我指出正确的方向,让我知道如何解决这个问题,我将不胜感激。提前致谢!

编辑 -

用于集群和客户端的 Hazelcast 版本是 3.9 。此外,我正在使用嵌入在 spring 启动应用程序中的 hazelcast。不觉得会有什么影响,但是想让大家知道。

@Indraneel-Bende,几个建议:

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

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