Какая архитектура бекенда чаще всего используется для обработки временной информации, такой как капчи и прочее?

Где обычно хранятся примитивные временные данные, такие как текущая капча и количество введённых попыток, в SPA сервисах с авторизацией и прочим функционалом? Следует ли хранить эти данные в базе данных на диске, или их обычно размещают в памяти/сессиях?
  • 26 января 2024 г. 20:28
Ответы на вопрос 2
Архитектура бекенда для обработки временной информации, такой как капчи, должна предусматривать обеспечение безопасности и производительности. Здесь нет универсального решения, так как выбор архитектуры зависит от требований и масштабов конкретного приложения. Однако существуют некоторые общепринятые практики:

1. **Распределенные кеши и хранилища сессий**: Такие системы, как Redis или Memcached, часто используются для хранения временных данных из-за их высокой производительности и возможности быстро извлекать данные. Они идеально подходят для хранения информации, которая требует частого доступа и не требует долговременного сохранения.

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

3. **Базы данных на диске**: Традиционные реляционные (например, PostgreSQL, MySQL) или NoSQL (например, MongoDB, Cassandra) базы данных обычно используются для долгосрочного хранения данных, но могут быть не лучшим выбором для очень частых и быстрых операций чтения/записи временной информации из-за относительно высокой задержки и затрат на I/O операции.

4. **In-memory хранение**: При работе с очень частыми запросами и необходимостью быстрой обработки, также может быть предпочтительным использование in-memory баз данных (таких как Redis) или простое использование локальной памяти ограниченного времени жизни на самом веб-сервере.

Для SPA (Single-Page Application) сервисов, где часть состояния приложения может содержаться на клиенте (в браузере пользователя), обычно предпочитают использовать сочетание клиентского и серверного хранения данных:

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

Таким образом, информация о капче и количество введенных попыток логичнее всего хранить на стороне сервера в распределенном кеше/сессии или in-memory базе данных, чтобы обеспечить их быстрый доступ и обработку, а также возможность масштабирования системы. Важно также учитывать, что по истечении определенного времени или после выполнения соответствующих действий (например, успешное ввод капчи) такие временные данные следует удалять для освобождения ресурсов.
Тут напрашивается Redis. 
1. Ничего страшного не произойдёт, если разок при вводе капчи пользователя попросят ввести её ещё раз, если на стороне твоего Бэка что-то потеряется.

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

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