我有一个两个节点Hazelcast集群,每个集群的堆大小为6GB。我有一个谓词,它运行在四个字段上,例如,让我们考虑一个类Employee
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引导应用程序中。不认为那会有什么效果,但想让大家都知道。
发布于 2019-02-12 18:12:34
@Indraneel,有几个建议:
AND谓词,那么在检索所有4个谓词结果之后,将选择所有4个结果上的通用谓词。因此,如果这些字段中的任何一个具有较低的基数,并且返回了太多的结果,这将减慢谓词的速度。因此,我建议只在一个具有最高基数的字段上定义一个索引,或者最多为两个字段定义一个索引。IdentifiedDataSerializable,如果字段太多,每次都要支付全部反序列化成本。相反,您可以实现Portable序列化。尽管存储的条目大小会更大,但这样Hazelcast成员就可以反序列化您在这些谓词中使用的字段,并加快查询速度。hazelcast.index.copy.behavior设置为NEVER。这也将加快查询的速度。我个人建议一个一个地测试它们。我的第一个建议肯定会提高查询速度。如果您需要进一步的性能,请尝试第二种方法&看看不同之处。由于最后一个可能会导致错误或重复的结果,如果您的成员资格改变,而查询,我会谨慎使用它。
https://stackoverflow.com/questions/54606534
复制相似问题