0

在 Spring Boot 应用程序中,我在内存中保留了一个 TreeMap。我每秒执行大约 10,000 次操作,并且可能会增加。为了提高性能,我将数据保存在内存中。我希望我的应用程序能够在应用程序重新启动时从相同的状态启动。

我可以为此找到一些方法。

  1. 将数据保存在 hazelcast 上。在这种情况下,除非 hazelcast 死了,否则我不会冒险丢失数据,但是如果 hazelcast 死了,我将无法恢复数据。此外,我认为在 Hazlecast 上同步这么多操作是没有意义的。
  2. 将事件同步到数据库。在这里,我的数据丢失风险非常低。但是,我需要在每次操作后执行查询。这可能会影响性能。另外,我需要处理数据库更新的异常。
  3. 批量同步数据 我在这里只能找到一个现成的解决方案,MapDB。我打算尝试一下,但我还没有尝试过。如果有更可靠、优化的接收器解决方案也使用 db 而不是文件,我更愿意使用它。

有什么建议可以解决这个问题吗?

4

1 回答 1

1

您需要 Map 还是 TreeMap ?整理顺序是否与存储、访问或两者都不相关。

对于 Hazelcast,数据丢失的可能性是可配置的。您可以设置具有所需弹性级别的集群。这与磁盘相同,如果您有一个磁盘并且它发生故障,则会丢失数据。如果你有两个和一个离线,你不会丢失数据。您可以根据所需的弹性级别分配硬件。三是推荐的最小值。

(每秒10,000也不担心,1,000,000,000已经完成。同步到外部存储可以立即或批量)

免责声明,我为 Hazelcast 工作,但我认为您的问题更为根本——您如何保持您的商店可用。

简单地说,不要重新启动。集群解决方案就是这里的答案。如果您有多个节点,即使有几个节点下线,整个服务也会保持运行。做滚动反弹。

如果您必须立即重新启动所有内容,那么重要的是您的服务能够以多快的速度恢复所有数据,以及在恢复完成 50% 时它会做什么(50% 的数据是否可见?)。仅当您拥有尚未配置弹性的集群解决方案时,才真正需要立即复制到其他地方。如果您已经解决了弹性问题,那么间歇性地保存就可以了。

因此,配置您的存储使其不会脱机,使备份/恢复的解决方案选项变得更加容易。

于 2022-03-03T15:18:03.300 回答