Я работаю над приложением реального времени со следующими характеристиками:
- Сотни клиентов будут вставлять строки/документы одновременно, каждый из которых вставляет строку каждые пару секунд.
- В основном только для добавления; почти все строки/документы, однажды вставленные, никогда не изменяются.
- Клиент должен увидеть успех только в том случае, если данные были сброшены на диск, и после этого должна сохраняться согласованность чтения и записи.
- Клиенты готовы ждать подтверждения порядка секунд — достаточно долго, чтобы выполнить несколько операций поиска и записи на диск.
- Слишком много данных, чтобы поместиться в ОЗУ (исключая такие варианты, как Redis). Но доступ к давно записанным строкам осуществляется редко, поэтому допустимо не хранить их в памяти.
- В идеале эти записи не должны блокировать чтение.
- Хранилище «ключ-значение» — это хорошо, но должен быть хотя бы один надежный автоинкрементный индекс.
Другими словами (и tl;dr), клиенты могут терпеть задержку, но им нужна большая доверенная пропускная способность записи - больше пропускной способности, чем "одна запись - одна дисковая операция".
Я представляю базу данных, которая будет реализована примерно так: принимать (теоретически ограниченное числом файловых дескрипторов) количество TCP-соединений, буферизовать эти записи в памяти, записывать их на диск как можно чаще (вместе с обновления автоинкрементного индекса) и отвечать на эти TCP-соединения только после завершения соответствующей операции записи на диск. Или это может быть так же просто, как база данных с ленивой записью, публикующая сообщение о том, что она выполнила запись на диск (клиенты ждут ленивого ответа, а затем ждут сообщения о записи, чтобы сообщить об успехе).
Я думаю, что с такой высокой устойчивостью к задержке это не слишком много. И я полагаю, что у других была эта проблема, например, у финансовых компаний, которые не могут позволить себе потерять данные, но могут позволить себе задержать ответ любому клиенту.
Поддерживают ли такие проверенные решения для баз данных, как Postgres, CouchDB/Couchbase или MongoDB, такие режимы работы?