【问题标题】:Hazelcast load data from RDBMS in client-server topologyHazelcast 在客户端-服务器拓扑中从 RDBMS 加载数据
【发布时间】:2021-06-17 10:22:06
【问题描述】:

我正在为 hazelcast 缓存使用客户端-服务器拓扑。我有多个地图,我使用 MapLoaders 急切地加载它们。当缓存未命中时,调用 Maploader 的 load(key) 方法。 MapLoader.load(key) 方法似乎是由分区线程执行的,这意味着分区上的所有其他操作都被阻塞,直到加载完成。 MapLoader 的一个非常常见的用例是从数据库加载数据,这可能需要一些时间。那么最好的方法是什么,以便在发生 laod 时不会阻塞分区上的其他操作?有没有其他方法可以在运行时加载缺失的数据?(Hazelcast 版本:Hazelcast 4.0.3)

【问题讨论】:

    标签: hazelcast hazelcast-imap hazelcast.net


    【解决方案1】:

    this question 有一个很好的答案,它提供了一些选项。

    MapLoader.load(key) 只加载一个条目,但如果远程源真的很慢或者有很多缓存未命中,它就会加载。

    @mike-yawn 答案的另一种选择是使用Runnable 从数据库中获取所需项目并将它们直接写入地图。您仍然可以使用MapLoader.load(key),但是如果您的提取器代码能够很好地预测需要哪些条目,那么缓存未命中的可能性就会降低。

    如果您没有缓存 100% 的记录,那么缓存未命中是不可避免的。如果它非常慢,您总是可以返回一个 Entry.Value ,其中包含某种标志,它是一个占位符并启动一个线程来执行实际加载。然后您的代码必须处理该占位符并稍后重试——注意当它稍后尝试时,数据库查询的最终结果可能找不到记录。

    【讨论】:

    • 感谢@Neil Stevenson 的回答。对于急切的缓存加载,是否有比 maploader 更多的选项。目前我正在加载大约 8 张地图,大约需要 7.5 分钟。
    • 你的loadAllKeys()loadAll(Collection<K>) 方法有时间安排吗?如果数据库从根本上来说很慢,最好的选择是避免重新启动。
    • 还有一个选择,不过是商业版。
    • 对于急切的缓存加载,还可以考虑将 Jet 引擎用作 Hazelcast 的大规模并行 ETL。它可以作为独立集群运行(一旦填充缓存就关闭)或在 Hazelcast 内部(运行 Jet 集群而不是 Hz 集群)。代码示例:github.com/hazelcast/hazelcast-jet/tree/master/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多