首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hazelcast谓词在重负载期间被卡住

Hazelcast谓词在重负载期间被卡住
EN

Stack Overflow用户
提问于 2019-02-09 13:10:22
回答 1查看 623关注 0票数 0

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

代码语言:javascript
复制
  public class Employee {
  String id,
  String name,
  String surname,
  String timestamp
  .....
  }

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

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

编辑-

用于集群和客户端的Hazelcast版本为3.9。此外,我正在使用hazelcast作为嵌入在spring引导应用程序中。不认为那会有什么效果,但想让大家都知道。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-12 18:12:34

@Indraneel,有几个建议:

  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。这也将加快查询的速度。

我个人建议一个一个地测试它们。我的第一个建议肯定会提高查询速度。如果您需要进一步的性能,请尝试第二种方法&看看不同之处。由于最后一个可能会导致错误或重复的结果,如果您的成员资格改变,而查询,我会谨慎使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54606534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档