Проблема
В настоящее время я реализую решение для одной довольно старой системы, которой требуется облегченное хранилище ключей-значений на основе файлов (значение ключа хранится в виде файла) с простыми операциями, подобными ConcurrentHashMap: put(), delete(), get() и listAll(). Он должен предоставлять возможность параллельных операций чтения и записи с полноценным транзакционным поведением (ACID + повторяемая изоляция чтения).
Кажется, этот компонент должен выглядеть очень похоже на TableFS...
Подход
Первоначальная идея состоит в том, чтобы взять облегченное встраиваемое постоянное хранилище ключей и значений и использовать его для хранения метаданных для файлов значений, расположенных в файловой системе (ключ файла, путь к файлу, размер, другие атрибуты...). Кроме того, он должен обеспечивать механизм быстрого поиска файлов на основе индексов. Так что, такое хранилище играет роль реестра...
Я довольно долго искал такое хранилище ключей-значений, которое могло бы удовлетворить следующие требования:
- Открытый источник;
- Встраиваемый;
- Обеспечить поддержку карт и коллекций Java;
- Устойчивость к сбою/отключению машины (журналы с упреждающей записью и другие подходы);
- Обеспечение ACID транзакции;
- Хранилище для чтения и записи (по сравнению с PalDB только для чтения).
и придумал варианты MapDb и LevelDb.
Поскольку мне нужно обеспечить разрешение параллелизма для этих пользовательских транзакций чтения/записи, мне нужно установить глобальные транзакции XA, включая хранилище ключ-значение и файловую систему. Для файловой системы есть системы транзакций XADisk и Jakarta Commons-Transactions, также для глобальной архивации есть менеджер транзакций Atomikos Essintials.
Однако я не могу найти ни одной статьи, объясняющей, как настроить MapDB или LevelDB с помощью диспетчера транзакций XA...
Вопросы
Не могли бы вы предложить следующее?
- имеет ли смысл мой подход или есть какие-то известные решения/реализации для описанной проблемы?
- какой подводный камень вы видите в этой задаче/подходе?
- есть ли какие-либо ресурсы, описывающие, как настроить такие хранилища ключ-значение для участия в транзакциях xa?
Обновления
Есть еще одна база данных — SQLite — которую можно интегрировать с Atomikos. Он не имитирует коллекции Java, но довольно легко эмулировать все операции вручную. Единственная ловушка, которую я вижу на данный момент, - это способ разрешения параллельных модификаций ключей с помощью параллельных транзакций (проблема потерянного обновления). Похоже, потребуется написать своего рода хранимую процедуру с функцией проверки и установки на основе временной метки ключа...