我们目前正在评估 hazelcast 是否满足我们的需求(以及获得许可证的可能性)。在其中一个测试设置中,我们有一个 iMap,其“值”如下所示:
class Market {
boolean useable;
long idA;
long idB;
long idC;
}
我们正在尝试使用 Predicates API 对其发出查询:
Predicate<Long, Market> predicate = Predicates.and(
Predicates.equal("useable",true),
Predicates.in("idA", idsA.toArray(Long[]::new)),
Predicates.in("idB", idsB.toArray(Long[]::new)),
Predicates.in("idC", idsC.toArray(Long[]::new)));
这些
idsA
、idsB
和idsC
的值很少,最多可达5个;该映射中有大约 500_000 个条目,跨 3 个节点(我们使用紧凑序列化器)。我们尝试为这些创建各种索引,以下是一些:
- type: HASH
attributes:
- useable
- type: HASH
attributes:
- idA
- type: HASH
attributes:
- idB
- type: HASH
attributes:
- idC
另一种选择是我们这样做的时候:
- type: HASH
attributes:
- useable
- type: SORTED
attributes:
- idA
- idB
- idC
虽然我们确实在管理控制台中看到这些索引被命中,但响应很慢,因此我们尝试启用:
config.setProperty(ClusterProperty.QUERY_PREDICATE_PARALLEL_EVALUATION.getName(), "true");
和:
hazelcast:
executor-service:
"hz:query":
pool-size: 64
但是它们都没有带来任何显着的性能提升,简单的:
wrk -t50 -c50 -d60s "http://localhost:8080/markets"
显示:
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.06s 350.08ms 1.98s 69.28%
平均 1 秒太大了。
在进行分析之前,我们的索引选择是否正确?
我们拍摄了一些火焰图并使用异步分析器进行分析,并且索引对于我们拥有的数据量来说表现得很好。我们还启用了这些:
@Bean
HazelcastConfigCustomizer predicatesParallelExecutor() {
return hzInstanceConfig -> {
hzInstanceConfig.setProperty(ClusterProperty.QUERY_PREDICATE_PARALLEL_EVALUATION.getName(), "true");
hzInstanceConfig.setProperty(ClusterProperty.CLIENT_ENGINE_THREAD_COUNT.getName(), "50");
hzInstanceConfig.setProperty(ClusterProperty.CLIENT_ENGINE_QUERY_THREAD_COUNT.getName(), "50");
};
}
结果仍然很糟糕。我们以紧凑反序列化为主。