Как кэшировать на нескольких узлах для масштабируемости - PullRequest
2 голосов
/ 06 февраля 2012

К вашему сведению - я новый участник, довольно новый программист, и это мой первый пост на stackoverflow.

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

Вероятно, типичный сценарий проблемы:

  1. Person A читает версию # 1 записи # 1 на узле # 1; кеш обновляется на узле №1.
  2. Человек B читает версию # 1 записи # 1 на узле № 2; кеш обновляется на узле № 2.
  3. Персона А обновляет запись № 1 на узле № 1;
    • данные не читаются из БД, поскольку они находятся в кеше.
    • Кэш обновлен версией № 2 записи № 1.
    • версия # 2 для записи данных отправляется в БД.
  4. Человек B читает запись № 1 на узле № 2;
    • данные не читаются из базы данных, поскольку они находятся в кеше, что приводит к версии # 1, которая сейчас устарела.

Итак, есть несколько идей, которые приходят на ум.

  1. Я могу отбросить кеширование, и каждое чтение / запись происходит из БД (очевидно, со мной не в порядке).
  2. Я мог бы реализовать некоторую форму согласованного хеширования. т. е. я мог бы отправить все элементы записи № 1 на узел № 1. Однако я обнаружил, что есть данные, которые должны быть общими для каждого узла, например данные профиля пользователя (т. е. когда обновляется запись № 1, профиль пользователя тоже должен обновляться). , так что мне нужно попасть в другие узлы кешей, а у меня останется та же проблема с записями профиля).
  3. Я мог бы использовать согласованное хеширование для записей и каким-то образом разделить пользовательские данные так, чтобы слой данных не был кэширован (все еще не идеален).
  4. Я мог бы выучить эрланг и начать посылать сообщения между слоями кэша, однако я попробовал свои силы в эрланге, которого никогда не было (вероятно, идеальное техническое решение, но я бы предпочел не изучать эрланг - лол).

Так что я впервые об этом много думал. Любые известные стратегии, которые программист-хобби, похожий на отшельника, как я должен знать Идеи, решения?

Примечания: - Мой основной язык - Clojure, хотя это не обязательно относится к рассматриваемой проблеме. - Я уже использую базы данных NoSQL.

Спасибо.

1 Ответ

0 голосов
/ 18 мая 2012

Если вы действительно заинтересованы в реализации своего собственного решения для кэширования и хотите синхронизировать узлы, то, возможно, вы захотите добавить какой-либо интерфейс аннулирования внешнего кэша в вашу систему.

Например, если ваша база данных NoSQL поддерживает перехваты после обновления, она может выдать команду multicast UDP всем узлам, что какое-то значение больше недопустимо. В качестве альтернативы вы можете использовать какую-то очередь сообщений для этого (например, ActiveMQ или RabbitMQ ), но это, вероятно, будет излишним.

Поскольку Clojure является языком на основе JVM, вы можете просто использовать существующее решение для кэширования JVM, например Ehcache . Если вы не внедряете эту систему кэширования в образовательных целях, это может сэкономить вам много времени и усилий.

Кстати, изучение Эрланга - отличное сочетание веселья и полезного опыта. Я никогда не жалею, что потратил некоторую часть своей жизни, чтобы привыкнуть к этому. Это точно окупится и в вашем случае.

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