我正在构建一个应用程序,其中包含一个以或多或少的交互方式批量标记数百万条记录的功能。用户交互与 Gmail 非常相似,用户可以标记单个电子邮件,或批量标记大量电子邮件。我还需要对这些标签成员身份进行快速读取访问,并且读取模式或多或少是随机的。
现在我们正在使用 Mysql 并为每个标签文档对插入一行。将数百万行写入 Mysql 需要一段时间(高 I/O),即使是批量插入和大量优化。我们需要这是一个交互过程,而不是批处理过程。
对于我们存储和读取的数据,数据的一致性和可用性不如性能和可扩展性重要。因此,如果在写入时发生系统故障,我可以处理一些数据丢失。但是,数据肯定需要在某个时候持久化到辅助存储中。
所以,总结一下,要求如下:
- 潜在数千万条记录的低延迟批量写入
- 数据需要以某种方式持久化
- 低延迟随机读取
- 不需要持久写入
- 最终的一致性是好的
以下是我看过的一些解决方案:
- 写在缓存(Terracotta、Gigaspaces、Coherence)后面,记录被写入内存并异步排入数据库。这些让我有点害怕,因为它们似乎给我想要避免的应用程序增加了一定的复杂性。
- 高度可扩展的键值存储,如 MongoDB、HBase、Tokyo Tyrant