Я создаю приложение, которое включает в себя функцию массовой маркировки миллионов записей более или менее интерактивно. Взаимодействие с пользователем очень похоже на Gmail, где пользователи могут помечать отдельные электронные письма или массово помечать большое количество электронных писем. Мне также нужен быстрый доступ для чтения к этим членствам в тегах, и где шаблон чтения является более или менее случайным.
Прямо сейчас мы используем Mysql и вставляем одну строку для каждой пары тег-документ. Запись миллионов строк в Mysql занимает некоторое время (большой ввод-вывод), даже при массовых вставках и тяжелой оптимизации. Нам нужно, чтобы это был интерактивный процесс, а не пакетный процесс.
Для данных, которые мы храним и читаем, непротиворечивость и доступность данных не так важны, как производительность и масштабируемость. Таким образом, в случае сбоя системы во время записи я могу справиться с некоторой потерей данных. Однако в какой-то момент данные обязательно должны быть сохранены во вторичном хранилище.
Итак, резюмируя, вот требования:
- Массовая запись потенциально десятков миллионов записей с малой задержкой
- Данные должны быть сохранены каким-то образом
- Случайное чтение с низкой задержкой
- Надежная запись не требуется
- Конечная согласованность в порядке
Вот некоторые решения, которые я рассмотрел:
- Запись за кэшами (Terracotta, Gigaspaces, Coherence), где записи записываются в память и асинхронно передаются в базу данных. Это меня немного пугает, потому что кажется, что они добавляют определенную сложность приложению, которого я бы хотел избежать.
- Высоко масштабируемые хранилища ключей и значений, такие как MongoDB, HBase, Tokyo Tyrant.