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