Эффективный способ проверить статус оплаты в узле? - PullRequest
0 голосов
/ 08 января 2019

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

Мои решения :

Использование JWT : всякий раз, когда пользователь входит в систему, я пишу next_payment_date (проверка по базе данных) в jwt и подписываю его. поэтому каждый раз, когда пользователь отправляет запрос на защищенные маршруты (маршруты, к которым могут обращаться только платные пользователи), я декодирую токен и проверяю next_payment_date и действую соответственно

Проблема с этим методом : допустим, пользователь использует телефон и компьютер. На компьютере он получает уведомление об истечении срока платежа и делает платеж успешно. НО позже, когда он использует телефон, его телефон не обновит **jsonwebtoken**, что заставит его перенаправить на страницу оплаты (что не является хорошим знаком)

Решение 2:

Всегда проверяйте статус платежа из базы данных.

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

Если вы знаете какой-либо лучший / эффективный способ решения этой проблемы, пожалуйста, предложите мне

1 Ответ

0 голосов
/ 08 января 2019

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

Итак, решение:

Всегда проверяйте статус оплаты

Но храните его в Redis.

В этом случае вам нужно обновить статус платежа пользователя на действии.
Вы можете просто сохранить статус платежа пользователя как логическое значение и обновить его при совершенном платеже.
Чтобы удалить статус платежа, вы можете использовать ключ EXPIRE (установите их на шаге платежа), а Redis удалит пользовательский платеж из памяти.
Если ваше приложение будет очень большим, и вы хотите по-настоящему эффективно использовать память, прочитайте больше об EXPIRE здесь и здесь и выберите, будет ли оно полезным для вас.

Примечание. Кроме того, в случае JWT пользователь может изменить его, поэтому, если вы полностью доверяете JWT, пользователь может обмануть вас. Есть еще возможные проблемы с JWT, вы можете прочитать здесь

[UPDATE]:
О MongoDB упоминается в комментарии.
Как вы сказали в решении 2 «... который является бесполезной операцией чтения», каждая служба с отслеживанием состояния в вашей базе данных отслеживает состояние.
Что означает, что он должен где-то сохранять данные. Для этой задачи базы данных используют диск.
Неважно, база данных SQL или NoSQL, она должна читать / записывать данные с / на диск. Значит, это требует дополнительного времени и ресурсов.
С другой стороны, службы в памяти хранят данные в памяти, что означает, что коду не нужно идти в базу данных, запрашивать поиск данных на диске, ждать, пока db найдет данные на диске, а затем вернуться к пользователю.
В памяти просто найти данные в памяти, что очень быстро. Более подробную информацию вы можете прочитать здесь .

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

...