Разработка платформы Entity с акцентом на производительность произвольного чтения - PullRequest
0 голосов
/ 06 сентября 2018

В настоящее время я разрабатываю платформу Entity с использованием Java и MongoDB. Однако используемый язык и база данных не важны для моего вопроса, но я буду использовать их для своих примеров.

Мое приложение очень тяжело читается, и записи происходят не часто.

Я ищу лучший способ спроектировать систему персистентности для моих сущностей, моя цель - обеспечить очень быструю скорость чтения при сохранении гибкости.

Сущность реализована с помощью простых методов setThing(Thing thing) и Thing getThing() в экземпляре сущности.

Например, сущность может быть в основном описана с помощью этого интерфейса:

public interface MyEntity {

    String getName();

    void setName(String name);

}

Характеристики моего приложения

  • может быть несколько экземпляров приложения, обращающихся к одному и тому же серверу базы данных, состояние объекта должно быть согласованным во всех экземплярах приложения
  • существует намного больше операций чтения, чем записи, это означает, что производительность операций чтения должна быть действительно хорошей.
  • доступ на чтение к полям сущности довольно случайный, некоторые части приложения получают только одно поле, а другие получают несколько значений.

Идеи, которые я рассмотрел

  • Кэширование всего документа

    • Чтение: если документ сущности в настоящее время не кэшируется, весь документ будет загружен в кэш, и дальнейшие чтения отдельных значений будут иметь доступ к кэшу, что сделает чтение (кроме первого) очень быстрым.

    • Запись: Приложение автоматически решит, когда записывать кэшированный документ в базу данных.

    • Проблема: документ в базе данных никогда не является текущей версией, поскольку только приложение знает о текущей версии в своем кэше. Это означает, что одновременно может быть только один экземпляр приложения.

  • Кэширование всего документа в системе распределенной памяти

    • Чтение: то же, что и первая идея, но кеш - это распределенная система памяти.

    • Запись: то же, что и первая идея, но кеш - это распределенная система памяти.

    • Проблема: решает проблему первой идеи, но вводит новую проблему, заключающуюся в том, что должна существовать система, которая решает, какой экземпляр приложения отвечает за чтение, когда и что, и т. Д., А также усложняет разработку поскольку распределенная природа структуры кэша должна всегда учитываться.

  • Нет кэширования, чтения и записи непосредственно в базу данных

    • Чтение: поле запрашивается путем вызова метода объекта, значение будет считано из документа в базе данных и возвращено вызывающему методу.

    • Запись: значение, переданное методу, будет записано в документ в базе данных.

    • Проблема: должно быть несколько запросов, если часть приложения хочет получить доступ к нескольким свойствам, что замедляет все, так как задержка умножается на количество запросов.

  • Нет кэширования, чтения и записи непосредственно в базу данных, но с использованием всего документа

    • Чтение: поле запрашивается путем вызова метода объекта, весь документ будет считан из базы данных и возвращено выбранное значение.

    • Запись: значение, переданное методу, будет записано в документ в базе данных.

    • Проблема: Очевидно, что это не очень хорошая идея, поскольку запрос больше, чем нужно, и все еще не решает проблему идеи с одним значением.


Как вы думаете, что это лучший способ решить эту проблему? Есть ли у вас другие идеи, кроме тех, которые у меня уже были, которые соответствуют требованиям моего приложения?

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...