代码之家  ›  专栏  ›  技术社区  ›  Indraneel Bende

Hazelcast谓词在重载期间卡住

  •  0
  • Indraneel Bende  · 技术社区  · 5 年前

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

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

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

    如果有人指点我如何解决这个问题的正确方向,我将非常感激。提前谢谢你!

    编辑-

    用于集群和客户端的Hazelcast版本是3.9。另外,我将hazelcast嵌入到一个spring boot应用程序中。别以为会有什么效果,但想让你们都知道。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Gokhan Oner    5 年前

    @Indraneel Bende,有几个建议:

    1. Hazelcast查询引擎计算所有谓词并合并结果。如果是 AND 谓词,检索完所有4个谓词结果后,将选择所有4个结果上的公共结果。因此,如果这些字段中的任何一个具有低基数并返回太多结果,这将减慢谓词的速度。所以,我建议只在一个具有最高基数的字段上定义索引,或者最多在两个字段上定义索引。
    2. 由于不是所有字段都将被索引,因此需要对从索引存储返回的条目进行反序列化以应用未索引谓词。即使有 IdentifiedDataSerializable ,如果字段太多,则每次都要支付完整的反序列化成本。相反,您可以实现 Portable 序列化。尽管存储的条目大小会更大,但是这样Hazelcast成员就可以反序列化您在这些谓词中使用的字段,从而加快查询速度。
    3. 如本文所述, https://docs.hazelcast.org/docs/3.9/manual/html-single/index.html#copying-indexes ,将复制索引结果以确保结果正确,特别是新节点加入/离开群集。如果您确定成员资格不会更改,则可以设置 hazelcast.index.copy.behavior NEVER . 这也会加快查询速度。

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

    推荐文章