К вашему сведению - я новый участник, довольно новый программист, и это мой первый пост на stackoverflow.
Для своих веб-приложений я писал свой собственный слой кэширования данных; При этом приложение было настроено на выборку данных из базы данных, только когда они не найдены в кеше. И со временем приложение удаляет устаревшие данные из кэша, чтобы минимизировать объем данных, хранящихся в оперативной памяти. Это помогло мне ограничить количество запросов только для чтения к серверу базы данных, при условии, что мое веб-приложение находится на одном сервере. Сейчас я думаю о распределении нагрузки моего веб-приложения на множество узлов, и я хотел бы сохранить реализацию кэширования как есть. Проблема, которую я пытаюсь решить, состоит в том, как поддерживать синхронизацию слоев кэша различных узлов веб-приложений.
Вероятно, типичный сценарий проблемы:
- Person A читает версию # 1 записи # 1 на узле # 1; кеш обновляется на узле №1.
- Человек B читает версию # 1 записи # 1 на узле № 2; кеш обновляется на узле № 2.
- Персона А обновляет запись № 1 на узле № 1;
- данные не читаются из БД, поскольку они находятся в кеше.
- Кэш обновлен версией № 2 записи № 1.
- версия # 2 для записи данных отправляется в БД.
- Человек B читает запись № 1 на узле № 2;
- данные не читаются из базы данных, поскольку они находятся в кеше, что приводит к версии # 1, которая сейчас устарела.
Итак, есть несколько идей, которые приходят на ум.
- Я могу отбросить кеширование, и каждое чтение / запись происходит из БД (очевидно, со мной не в порядке).
- Я мог бы реализовать некоторую форму согласованного хеширования. т. е. я мог бы отправить все элементы записи № 1 на узел № 1. Однако я обнаружил, что есть данные, которые должны быть общими для каждого узла, например данные профиля пользователя (т. е. когда обновляется запись № 1, профиль пользователя тоже должен обновляться). , так что мне нужно попасть в другие узлы кешей, а у меня останется та же проблема с записями профиля).
- Я мог бы использовать согласованное хеширование для записей и каким-то образом разделить пользовательские данные так, чтобы слой данных не был кэширован (все еще не идеален).
- Я мог бы выучить эрланг и начать посылать сообщения между слоями кэша, однако я попробовал свои силы в эрланге, которого никогда не было (вероятно, идеальное техническое решение, но я бы предпочел не изучать эрланг - лол).
Так что я впервые об этом много думал. Любые известные стратегии, которые программист-хобби, похожий на отшельника, как я должен знать Идеи, решения?
Примечания:
- Мой основной язык - Clojure, хотя это не обязательно относится к рассматриваемой проблеме.
- Я уже использую базы данных NoSQL.
Спасибо.