Является ли 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) or die ("could not connect");
$data = json_encode(array("id"=>$user_id,"name"=>"aaa"));
$memcache->set("key-".$hash,$data);

И затем в ссылке передайте хеш-значение как параметр, например

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

и в node js - получить данные пользователя из memcache на основе хеш-ключа.

1) Правильно ли это подходит.

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

Заранее благодарим за ваши входы.

Ответы

Ответ 1

1) Правильно ли это подходит.

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

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

Правильно выберите условия недействительности.

2) Будет ли поддержка memcache хранить данные из большого количества пользователей

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


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

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

Причины

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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