我正在构建一个应用程序,其中包含一个或多或少以交互方式批量标记数百万条记录的功能。用户交互与 Gmail 非常相似,用户可以在 Gmail 中标记单个电子邮件,或批量标记大量电子邮件。我还需要快速读取这些标签成员资格,以及读取模式或多或少是随机的。

现在我们正在使用 Mysql 并为每个标签文档对插入一行。将数百万行写入 Mysql 需要一段时间(高 I/O),即使是批量插入和大量优化也是如此。我们需要这是一个交互式过程,而不是批处理过程。

对于我们存储和读取的数据,数据的一致性和可用性不如性能和可扩展性重要。因此,如果在写入过程中发生系统故障,我可以处理一些数据丢失。但是,数据肯定需要在某个时候持久化到二级存储中。

所以,总结一下,这里是要求:

  • 潜在数千万条记录的低延迟批量写入
  • 数据需要以某种方式持久化
  • 低延迟随机读取
  • 不需要持久写入
  • 最终一致性没问题

  • 以下是我看过的一些解决方案:
  • 写入缓存(Terracotta、Gigaspaces、Coherence),其中记录被写入内存并异步排放到数据库。这些让我有点害怕,因为它们似乎给我想要避免的应用程序增加了一定程度的复杂性。
  • 高度可扩展的键值存储,如 MongoDB、HBase、Tokyo Tyrant
  • 最佳答案

    如果您有预算为此使用 Coherence,我强烈建议您这样做。 Coherence 中直接支持后写、最终一致性行为,并且在数据库中断和 Coherence 集群节点中断(如果您在单独的 JVM 上使用 >= 3 个 Coherence 节点,最好在单独的主机上)时,它都可以很好地生存。我已经为一家财富 100 强公司的电子商务网站进行了大量 CRM 的实现,并且效果非常好。

    这种架构的最佳方面之一是您编写 Java 应用程序代码时,就好像没有发生任何后写行为,然后插入 Coherence 拓扑和配置使其发生。如果您稍后需要更改 Coherence 的行为或拓扑,则无需更改您的应用程序。我知道可能有一些合理的方法可以做到这一点,但这种行为在 Coherence 中得到了直接支持,而不必发明或手工制作一种方法。

    提出一个非常好的观点 - 您担心增加应用程序复杂性是一个很好的问题。使用 Coherence,您只需将更新写入缓存(或者如果您使用 Hibernate,它可以是 L2 缓存提供程序)。根据您的 Coherence 配置和拓扑,您可以选择部署应用程序以使用后写式、分布式缓存。因此,由于缓存的特性,您的应用程序不再复杂(并且坦率地说不知道)。

    最后,我在 2005 年到 2007 年间实现了上述解决方案,当时 Coherence 由 Tangosol 制造,并且他们得到了最好的支持。我不确定现在在 Oracle 下的情况如何——希望还是不错的。

    关于java - 低延迟读写的持久化策略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1764426/

    10-10 14:43