Автор оригинала: Vlad Mihalcea.
Транзакции реляционной базы данных являются ACID , а модель строгой согласованности упрощает разработку приложений. Поскольку включение гибернации кэширования-это одна конфигурация , очень привлекательно обращаться к кэшированию всякий раз, когда уровень доступа к данным начинает показывать проблемы с производительностью. Добавление слоя кэширования действительно может повысить производительность приложения, но у этого есть своя цена, и вы должны знать об этом.
Таким образом, база данных является центральной частью любого корпоративного приложения, содержащей ценные бизнес-активы. Сервер базы данных имеет ограниченные ресурсы, и поэтому он может обслуживать конечное число подключений. Чем короче транзакции базы данных, тем больше транзакций может быть размещено. Первое действие по настройке производительности заключается в сокращении времени выполнения запросов за счет правильной индексации и оптимизации запросов.
Когда все запросы и инструкции оптимизированы, мы можем либо добавить больше ресурсов ( масштабирование ), либо добавить больше узлов базы данных (масштабирование). Горизонтальное масштабирование требует репликации базы данных , что подразумевает синхронизацию узлов. Синхронная репликация сохраняет высокую согласованность, в то время как асинхронная одноосновная репликация приводит к конечной согласованности.
Аналогично задачам репликации баз данных, узлы кэша вызывают проблемы с синхронизацией данных, особенно для распределенных корпоративных приложений.
Даже если шаблоны доступа к базе данных должным образом оптимизированы, более высокие нагрузки могут увеличить задержку. Чтобы обеспечить предсказуемое и постоянное время отклика, нам нужно обратиться к кэшированию . Кэширование позволяет нам повторно использовать ответ базы данных для нескольких запросов пользователей.
Поэтому кэш может:
- уменьшите потребление ресурсов процессора/памяти/ввода-вывода на стороне базы данных
- сократите сетевой трафик между узлами приложений и уровнем базы данных
- обеспечивает постоянное время выборки результатов, нечувствительное к всплескам трафика
- предоставьте представление только для чтения, когда приложение находится в режиме обслуживания (например, при обновлении схемы базы данных).
Недостатком внедрения решения для кэширования является то, что данные дублируются в двух отдельных технологиях, которые могут легко рассинхронизироваться.
В простейшем случае у вас есть один сервер базы данных и один узел кэша:
Уровень абстракции кэширования осведомлен о сервере базы данных, но база данных ничего не знает о кэше уровня приложения. Если какой-либо внешний процесс обновит базу данных, не касаясь кэша, два источника данных не будут синхронизированы. Поскольку немногие серверы баз данных поддерживают уведомления на уровне приложений , кэш может нарушить строгие гарантии согласованности.
Чтобы избежать возможной согласованности, и база данных, и кэш должны быть зарегистрированы в распределенной транзакции XA, поэтому затронутые записи кэша либо обновляются, либо становятся недействительными синхронно.
Чаще всего существует несколько узлов приложений или несколько отдельных приложений (веб-интерфейсы, пакетные процессоры, планировщики), составляющих всю корпоративную систему:
Если каждый узел имеет свой собственный изолированный узел кэша, нам необходимо знать о возможных проблемах синхронизации данных. Если один узел обновляет базу данных и свой собственный кэш, не уведомляя остальных, то другие узлы кэша выходят из синхронизации.
В распределенной среде, когда несколько приложений или узлов приложений используют кэширование, нам необходимо использовать решение распределенного кэширования, чтобы:
- узлы кэша взаимодействуют в одноранговой топологии
- узлы кэша взаимодействуют в топологии клиент-сервер, а центральный сервер кэша обеспечивает синхронизацию данных
Кэширование-это прекрасный метод масштабирования, но вы должны знать о возможных проблемах с согласованностью. Принимая во внимание ваши текущие требования к целостности данных проекта, вам необходимо разработать приложение, чтобы использовать преимущества кэширования без ущерба для важных данных.
Кэширование не является сквозной проблемой, проникающей в архитектуру вашего приложения и требующей продуманного плана компенсации нарушений целостности данных.