Вопрос

Я думаю об использовании NoSQL (Mongodb) в паре с Memcached для хранения сеансов с моим WebApp. Идея заключается в том, что при каждой нагрузке страницы пользовательские данные сравниваются с данными в мемкате, и если что-то изменилось, данные будут записаны как Memcached, так и MySQL. Таким образом, чтения были бы значительно сокращены, а Memcached используется, чтобы сделать то, что он делает лучше всего.

Однако я немного обеспокоен использованием некислой базы данных для хранения сеанса, особенно с помощью слоя memcached. Давайте скажем, что-то идет не так, обновление сеанса в БД, и наши пользователи получили мгновенную головную боль, задаваясь вопросом, почему их продукт, который они помещают в корзину, не отображаются ...

Какой подходящий подход к этому? Должны ли мы пойти на хранение сеанса MySQL или в порядке, чтобы сохранить некислотный поддерживающую базу данных для сеансов?

Спасибо!

Это было полезно?

Решение

Если вы не хотите терять свои данные, придерживайтесь кислотных проверенных баз данных.

Что вы ищете высуг?

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

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

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

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

Если вы идете с чем-то действительно временным, вы проигрываете на получение остаточных преимуществ.

Другие советы

Я использую Mongodb в качестве хранилища сеанса в настоящее время. Можно избежать условий расы, упомянутых пилевом. Я нашел класс, который реализует обработчик сеанса для MongoDB (http://www.jqueryin.com/projects/mongo-session/) и развесил его на Github, чтобы удовлетворить мои потребности (http://github.com/halfdan/mongosession.).

Без какого-либо блокировки на сеансе не будет действительно, действительно осторожно о том, что вы храните. Никогда не храните все, что зависит от того, что вы прочитали до того, как данные могут измениться между вами чтением и записью - особенно в случае Ajax, где несколько запросов могут выходить сразу.

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

Посмотрите на эту статью по деталям: http://thwartedefofforts.org/2006/11/11/race-sonditions-with-ajax-and-php-sessions/

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

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

Вместо этого вы можете рассмотреть Озел. Отказ По состоянию на 1,9 он также поддерживает протокол Memcache. По сравнению с Memcached Hazelcast хочет, чтобы вы реализовывали карту Перчат И только сама обновляет базу данных для обновленных записей. Таким образом, вам не нужно обрабатывать «Check Cheche, если данные изменили данные обновления базы данных».

Если вы пишете свое приложение, так что пользователь хранит всю информацию об сеансе клиента, то вы просто проверяете эту информацию по мере необходимости, вам не нужно беспокоиться о сеансах на стороне сервера. Это один из принципов в архитектуре стиля отдыха. Например, если пользователь запрашивает добавление элемента в их корзину для покупок, просто сохраните список itemid и рассчитывайте на стороне клиента. Когда вы попадаете на страницу по тележке, вы можете легко посмотреть информацию о товаре из списка элементов, которые они говорят, находятся в своей корзине.

Во время оформления заказа идите прямо против базы данных с транзакциями, чтобы убедиться, что вы не получаете никаких условий ран и проверьте свой живой инвентарь. Если инвентарь не там, когда они ходят, чтобы проверить, просто скажите: «Извините, мы только что продали». Конечно, в этот момент вы должны отправиться в обновление любых кэшей, которые вы выходите, которые говорят людям, у вас есть инвентарь.

Я бы посмотрел на то, сколько пользователь стоит приобрести, а затем спросить, какова стоимость для реализации действительно хорошей системы. Имейте в виду, что пользователи - это метод биологической повторной попытки. «Мне скучно ... пресс-перезагрузить снова ...» В то время как это не самое совершенное решение, иногда приемлемо против Сравнения стоимости для «не потерять ничего - никогда».

Если вы хотите дополнительную безопасность, вы можете получить ваши сеансы кэшировать на отдельный набор серверов Memcache, поэтому нет случайных смычков. :)

Существует ряд других систем Membase.org, а некоторые другие постоянные решения MEMCache (реализации Java), которые будут сохраняться хранилище на диск. Если вы хотите немного изменять свой клиент или как вы доступаете в Memcache, вы можете выполнить свою собственную репликацию объектов сеанса Memcache.

-Даниэль

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top