Есть react приложение, суть которого собирать из чата в заданный промежуток времени (например 1 минуту) верные ответы пользователей и закидывать их через АПИ в БД и по истечении заданного времени, подсчитывать кол-во правильных ответов и раздавать баллы. Но так как запросов к БД очень много, получается мини ддос и сервер либо блокирует обращения к бд, либо запросы настакиваются и приходит например 10 ответов от 1 человека и 0 от второго.
Соответственно возник вопрос как это всё дело оптимизировать. Правильно ли я копаю в сторону асинхронных запросов в реакте и очереди запросов и джобы в Laravel? Или что-то еще посмотреть?
Буду очень благодарен за помощь
UDP по цифрам:
1. Время сбора ответов 30 секунд или минута
2. Пользователей от 3000 до 5000
3. Задержка между ответами для пользователей 5 секунд
4. Группа пользователей (около 100 человек), которые не имеют задержки между ответами и могут выдать в среднем около 10 ответов в секунду
goodlike_by,
10 ответов в секунду я так понял от всей сотни?
10 в секунду база должна переваривать, но если тест состоит из нескольких вопросов и имеет смысл принимать ответы только на весь тест а не на индивидуальный вопрос, то можно оптимизировать, например redux-saga на стороне UI и отправлять не один ответ, а когда пользователь ответит на всю пачку.
Чтобы получить запас по скорости еще есть вариант между базой и API поставить очередь типа Rabit MQ или аналоги, но тут я много подсказать не могу, не писал.
Если баллы подсчитываются только в конце, на кой писать каждый ответ? Собираем их на фронте и отправляем пачкой в конце.
Запрос на проверку в БД включает ответ пользователя? Логичнее брать из базы правильные ответы (запрос скэшируется и не будет дергать базу) и сравнивать их с ответами пользователя в скрипте, обращаясь к базе только для того, чтобы записать ответы и результат - один раз.
А с увеличением кол-ва пользователей, не будет подписать клиент? Если например их не 5000 будет, а 50000, сомнительно конечно, но в целом)
Но идея оптимизировать в таком ключе мне нравится, я еще думаю насколько мне нужна например статистика не правильных ответов, это бы еще снизило кол-во обращений
goodlike_by, идея в первую очередь в том, что если уперся в базу, то надо смотреть, где она нагружается не по делу, а уже потом, если не найдется узких мест, плясать с очередями.