Подходит ли memcache для передачи пользовательских данных из Apache в Node.js

У нас есть наш старый сайт, построенный на стеке LAMP с аутентификацией пользователя. Теперь мы создали новую социальную платформу для тех же пользователей с функциями чата, видео, дискуссионных форумов и т. Д., И мы использовали для этого node.js.

Когда пользователь входит в свою учетную запись на старом сайте - скажем, он может нажать на ссылку

www.xyz.com/social

который доставит его на эту новую платформу node.js.

Поэтому я не уверен, как передать данные пользователя из apache в node.js - все, что мне нужно, это идентификатор пользователя, а затем в node.js - я могу запросить таблицу mysql и загрузить данные пользователя.

Простое решение

Простое решение заключается в хешировании идентификатора пользователя и электронной почты, сохранении хеш-кода в качестве ключа на сервере memcache и передаче данных пользователя в виде значений.

$hash = md5($user_id+$email);
$memcache = new Memcache;
$memcache->connect("localhost",11211) или die ("не удалось подключиться");
$data = json_encode(array("id"=>$user_id,"name"=>"aaa"));
$ Memcache-> комплект (. "Ключ -" $ хэш,$ данных);

А затем в ссылке передать значение хеша в качестве параметра, как

www.xyz.com/social/$$hash-value$$

а в узле js - получить информацию о пользователе из memcache на основе хеш-ключа.

1) Правильно ли сейчас подойти к этому.

2) Поддержит ли memcache хранение данных о большом количестве пользователей (около 500 пользователей в данный момент времени), перемещающихся по сайту со старого сайта на новый сайт node.js.

Заранее спасибо за ваш вклад.

3 ответа

Решение

1) Правильно ли сейчас подойти к этому.

Да, это правильно делать так. Но может быть лучший подход к этому вопросу:

  • как предложил @alex-rokabilis. то есть "куки", просто поделитесь над ключом memcache, используя куки.
  • хранить детали, которые вы хотите поделиться через Apache и node.js в хранилище сеансов.

Выберите условия аннулирования правильно.

2) Поддержит ли memcache хранение данных стольких пользователей

Да, это будет.
Но это в значительной степени зависит от вашего развертывания memcache, сколько оперативной памяти вы предоставляете ему?
Подсчитайте или получите приблизительную оценку того, сколько ОЗУ необходимо для хранения 500 пользовательских данных. После того, как memcache перейдет в swap, обслуживание таких больших запросов станет болью для memcache.


Но, по моему мнению, лучшим способом для вас будет придерживаться только MySQL.

  • Пользователь аутентифицирован со стеком LAMP
  • Предоставьте это печенье md5(user-id . timestamp. KEY)и сохранить эту запись в базе данных.
  • Получить файл cookie в приложении node.js и посмотреть таблицу mysql
  • Получите данные соответственно
  • Добавьте кеширующий слой поверх этих поисковых запросов MySQL. (Таким образом, вы можете хранить выборочные kep-пары только в memcache, то есть для активных пользователей с небольшим временем ожидания ~10 секунд?)
  • Когда пользователь выходит из системы, просто удалите запись из таблицы MySQL, а также удалите ключ из memcache.

Причины

  • Как вы можете определить тайм-ауты, потому что пользователь может бесконечно (или в соответствии с тайм-аутом) войти в систему LAMP. Но он выйдет из node.js в соответствии с таймаутом.
  • Постоянство всегда будет проблемой, если вы полностью полагаетесь на memcache. Как вы будете перестраивать пары ключей после каждого перезапуска memcache, если у вас нет копии где-нибудь (MySQL)?

Memcache предназначен для службы кэширования данных, а не службы передачи данных. Нет гарантии, что значение, хранящееся в кэше, будет доступно для другого компонента.

То, что вы пытаетесь сделать, будет в основном работать, но, вероятно, у вас будут странные проблемы, когда вы начнете загружать систему. Вы, вероятно, хотите использовать систему очередей сообщений, такую ​​как RabbitMQ или Kafka, или вернуть memcached с базой данных.

Как показывают предыдущие ответы, это правильный путь с узким местом (нагрузка или трафик до оперативной памяти), что может быть реальной проблемой.

Я хотел бы предложить новый способ. вам на самом деле не нужно воспроизводить "данные сеанса уровня пользователя PHP". Вы можете использовать его прямо из nodejs. Для этого вам нужно изменить обработчик сессии старого кода лампы. Сохранять сессии в memcache в формате json. затем получить к нему доступ напрямую из nodejs. так как вы не воспроизводите никаких данных; вы сэкономите много оперативной памяти и операций ввода-вывода (если вы храните сессии в файлах или дБ), а также вы сэкономите вычислительные мощности. Все эти сбережения принесут вам производительность.

Вот пример кода для хранения данных сеанса в формате json в memcache.

https://github.com/lboynton/memcached-json-session-save-handler/blob/master/library/Lboy/Session/SaveHandler/Memcached.php

я не пробовал код но я думаю, что вы можете справиться с этим легко.

Другие вопросы по тегам