【问题标题】:How to improve Get method performace which reads data from hazelcast?如何提高从 hazelcast 读取数据的 Get 方法性能?
【发布时间】:2019-03-24 19:03:34
【问题描述】:

我有以下控制器:

@GetMapping("/v1/quotes")
public List<MyQuote> getQuotes() {
    return hazelcastMap.values().stream()
            .map(r -> new Quote(r))
            .collect(Collectors.toList());
}

这大约需要 330 毫秒,但我需要改进它以在 100 毫秒或更快的时间内执行请求。

有什么提高性能的想法吗?

【问题讨论】:

  • 通过分析器运行代码是否显示大部分时间都花在了哪里?重复运行是否会提高性能(Hazelcast 是否可能将数据节点带到本地,而不是在第一次调用期间必须从远程源获取它 - 抱歉,不知道 Hazelcast 的具体情况)?使用 'r' 参数的 Quote 构造函数在计算上是否昂贵?
  • @不是JD,引用构造函数很轻量级
  • @Not a JD 330 ms 是性能测试期间的汇总结果
  • 如果您手头没有 JProfiler 或 YourKit 之类的东西,请尝试通过 VisualVM 会话运行多个调用,看看大部分时间都花在了哪里。
  • @gstackoverflow,你在 Hazelcast 地图中有多少数据,包括 # 还是记录和总数据大小?此外,这是嵌入式和客户端/服务器部署吗?您能否提供一些有关部署的信息。 # 节点数、网络速度等?

标签: java performance optimization hazelcast hazelcast-imap


【解决方案1】:

人们普遍认为,流的效率比使用迭代器和/或循环的老式方法要低一些。但是您不太可能从中获得 300% 以上的改进。您可能会获得 10% 或 20% 的改进……如果您正在转换常规内存中的 Map。对于 Hazelcast IMap,使用流与优化代码的开销将是微不足道的。

(您应该能够通过针对您的应用程序进行分析和仔细的基准测试来验证这一点。)


我认为您将不得不在系统设计中解决这个问题,或者可能通过 Hazelcast 调整。

IMap javadoc 暗示了您当前所做的一些性能问题:

Collection&lt;V&gt; values()

返回此映射中包含的值的集合克隆。

警告:集合不受地图支持,因此对地图的更改不会反映在集合中,反之亦然。

此方法始终由分布式查询执行,因此如果配置了 GroupProperty.QUERY_RESULT_SIZE_LIMIT,它可能会抛出 QueryResultSizeExceededException。

问题是:

  • 当您调用values() 时,IMap 实现会创建地图值的副本。然后,您将从该副本而不是直接从 IMap 进行流式传输。

  • values() 操作正在执行分布式查询。我怀疑这是不可避免的。无论哪种方式,这可能是您正在做的最昂贵的部分。

【讨论】:

【解决方案2】:

您使用的是什么序列化?所有数据都需要序列化,这会对性能产生重大影响。 Java 序列化在空间和时间方面通常是最差的。 IdentifiedDataSerializable 通常是性能最好的。

【讨论】:

    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2019-04-05
    • 2017-05-01
    • 2012-04-10
    相关资源
    最近更新 更多