#caching #apache-kafka #server #redis #rabbitmq
#кэширование #apache-kafka #сервер #redis #rabbitmq
Вопрос:
Я хотел бы избавиться от cron, работающего каждые 20 секунд для загрузки данных из базы данных, чтобы кэшировать данные в памяти на серверах. Я знаю, что это выглядит довольно плохо, поэтому я хотел бы изменить дизайн для этого.
У меня есть две идеи.
Во-первых, я мог бы использовать message queue
like kafka
, rabbitMQ
и т.д. Раньше я использовал rabbitMQ
для решения этой проблемы в разных проектах. Это сработало бы.
Кстати, был предложен второй метод, который является redis
pub / sub. Это может действительно сработать. Тогда я смогу либо преобразовать весь кэш в памяти в redis-cache, либо просто обновить кэш в памяти при подписке.
Оба подхода хороши? Есть ли лучший способ достичь моей цели? Я должен сразу рассмотреть обновления нескольких серверов.
Комментарии:
1. Почему вы все еще используете pub / sub, если используете Redis?
2. @Gawain хорошо… у redis просто есть эта функция, и это может быть также тем, что я хотел
Ответ №1:
Для кэша в памяти наиболее важным моментом является обновление данных на сегодняшний день между несколькими серверами. И у решения MQ и Redis есть преимущества и недостатки.
Преимущество решения MQ заключается в том, что ваш кэш будет распределен по вашим серверам приложений, что может снизить нагрузку на кэш (с помощью балансировщика нагрузки впереди).
Недостатком является то, что вам необходимо убедиться, что кэш для каждого сервера синхронизирован. Поскольку прослушиватели MQ являются асинхронными, могут возникать задержки для разных серверов. И если ваш сервер потерял соединение с MQ, ваши данные также будут устаревшими. Кроме того, если вы кэшировали много данных, объем памяти вашего приложения может увеличиться, поскольку каждый ваш сервер поддерживает целую копию кэша.
Для Redis всегда будет использоваться один источник данных, поэтому синхронизация не будет проблемой. И вам не нужно использовать pub / sub, просто загрузите данные в Redis.
Но Redis будет испытывать огромную нагрузку, поскольку все серверы будут запрашивать кэш из одного и того же Redis.
Таким образом, вы можете сравнить преимущества и недостатки каждого решения на основе вашего случая.
Комментарии:
1. Как вы сказали, Redis должен запрашивать данные. В моем случае задержка довольно важна, поэтому я бы выбрал очередь сообщений вместо Redis. Спасибо!
2. Да, Redis увеличит задержку из-за сети. Также вы можете использовать memcached для локального кэша в памяти, который имеет более мощное управление кэшем.
3. Я решил выбрать
Redis pub/sub
и буду использовать memcached в локальной памяти.