Мне нужно сохранить некоторые данные в кеше на сервере. Серверы находятся в кластере, и вызов может перейти к любому из них. В таком случае лучше использовать реплицированный/распределенный кеш, например EhCache, или использовать сессионную липкость LB.
Если размер данных (в кеше) большой, не повлияет ли производительность сериализации и де-сериализации на все серверы?
Также в случае распределенного кеша, каково оптимальное количество серверов, до которых такой кеш эффективен. Так как данные реплицируются на все узлы и говорят, что число узлов равно 20, то он, как и master, решает задачу по всем узлам. Под этим я имею в виду, что каждый узел будет получать уведомления от других 19 и будет обновлять модификации других 19. Такие настройки типа os устанавливаются?
Как всегда в распределенных системах, ответ зависит от разных вещей:
Балансировщик нагрузки с липкими сеансами - это, конечно, более простой способ для разработчика, поскольку он не имеет никакого значения, если приложение работает на 1, 2 или 100 серверах. Если это все, о чем вы заботитесь, придерживайтесь его, и вы можете прекратить читать прямо здесь.
Я не уверен, как реализованы балансиры балансировки сеанса, и каков их общий предел в отношении запросов в секунду, но у них есть хотя бы один большой недостаток в распределенном кеше. - Что делать, если машина, обрабатывающая сеансы, отключена? - Если вы распределяете свой кеш, любая машина может обслуживать запрос, и не имеет значения, если один из них не работает. Сериализация/десериализация не является большой проблемой, скорее, сеть может быть узким местом, если вы не запускаете ее, по крайней мере, в 1 Гбит сетевой среде, но это должно быть хорошо.
AVG_CACHE_NEEDED_PER_CLIENT * NUMBER_OF_CLIENTS < MEMORY_FOR_CACHE_AVAILABLE (on one server)
памяти, и ее, по крайней мере, очень легко вычислить: AVG_CACHE_NEEDED_PER_CLIENT * NUMBER_OF_CLIENTS < MEMORY_FOR_CACHE_AVAILABLE (on one server)
. Если вам нужно больше кеша, чем у вас на любом узле вашего кластера EhCached, полная репликация будет невозможна.Разумеется, фактическое решение зависит от вашего конкретного случая использования и требований, предъявляемых к вашей заявке.
Лично я был очень рад, когда узнал сегодня, что у Azure WebPages есть балансировщик нагрузки с поддержкой липкой сессии, и мне не нужно перенастраивать мое приложение, чтобы использовать Redis в качестве хранилища объектов сеансов и просто хранить все как есть.
Но для огромной рабочей нагрузки с сотнями серверов простой балансировщик нагрузки, вероятно, будет довольно перегружен, а распределенный кеш, или централизованный реплицированный кеш (Redis), станет для вас способом.