В настоящее время я разрабатываю платформу Entity с использованием Java и MongoDB. Однако используемый язык и база данных не важны для моего вопроса, но я буду использовать их для своих примеров.
Мое приложение очень тяжело читается, и записи происходят не часто.
Я ищу лучший способ спроектировать систему персистентности для моих сущностей, моя цель - обеспечить очень быструю скорость чтения при сохранении гибкости.
Сущность реализована с помощью простых методов setThing(Thing thing)
и Thing getThing()
в экземпляре сущности.
Например, сущность может быть в основном описана с помощью этого интерфейса:
public interface MyEntity {
String getName();
void setName(String name);
}
Характеристики моего приложения
- может быть несколько экземпляров приложения, обращающихся к одному и тому же серверу базы данных, состояние объекта должно быть согласованным во всех экземплярах приложения
- существует намного больше операций чтения, чем записи, это означает, что производительность операций чтения должна быть действительно хорошей.
- доступ на чтение к полям сущности довольно случайный, некоторые части приложения получают только одно поле, а другие получают несколько значений.
Идеи, которые я рассмотрел
Кэширование всего документа
Чтение: если документ сущности в настоящее время не кэшируется, весь документ будет загружен в кэш, и дальнейшие чтения отдельных значений будут иметь доступ к кэшу, что сделает чтение (кроме первого) очень быстрым.
Запись: Приложение автоматически решит, когда записывать кэшированный документ в базу данных.
Проблема: документ в базе данных никогда не является текущей версией, поскольку только приложение знает о текущей версии в своем кэше. Это означает, что одновременно может быть только один экземпляр приложения.
Кэширование всего документа в системе распределенной памяти
Чтение: то же, что и первая идея, но кеш - это распределенная система памяти.
Запись: то же, что и первая идея, но кеш - это распределенная система памяти.
Проблема: решает проблему первой идеи, но вводит новую проблему, заключающуюся в том, что должна существовать система, которая решает, какой экземпляр приложения отвечает за чтение, когда и что, и т. Д., А также усложняет разработку поскольку распределенная природа структуры кэша должна всегда учитываться.
Нет кэширования, чтения и записи непосредственно в базу данных
Чтение: поле запрашивается путем вызова метода объекта, значение будет считано из документа в базе данных и возвращено вызывающему методу.
Запись: значение, переданное методу, будет записано в документ в базе данных.
Проблема: должно быть несколько запросов, если часть приложения хочет получить доступ к нескольким свойствам, что замедляет все, так как задержка умножается на количество запросов.
Нет кэширования, чтения и записи непосредственно в базу данных, но с использованием всего документа
Чтение: поле запрашивается путем вызова метода объекта, весь документ будет считан из базы данных и возвращено выбранное значение.
Запись: значение, переданное методу, будет записано в документ в базе данных.
Проблема: Очевидно, что это не очень хорошая идея, поскольку запрос больше, чем нужно, и все еще не решает проблему идеи с одним значением.
Как вы думаете, что это лучший способ решить эту проблему? Есть ли у вас другие идеи, кроме тех, которые у меня уже были, которые соответствуют требованиям моего приложения?
Заранее спасибо.