Распишу по порядку. Три пункта: Задача, Мое костыльное решение(проблемы) и Вопрос.
Задача:
Спойлер открывать только умникам и умницамЧтобы не углубляться и не расписывать свою задачу со всеми деталями которые не имеют отношения к вопросу, я привожу просто абстрактный пример, сторонников отвечать "зачем это нужно?", "это бесполезно" попрошу не оставлять комментарии, это очень важно для меня. Спасибо за понимание.
Есть сайт, в котором в определенное время будет нагрузка. Например: каждый день в 19:00 около 2000 пользователей нажимают на кнопку. В базе создается "цепь" в таблице:
id|parent_record_id|user_id
2 |_______________1|_____45
3 |_______________2|_____32
4 |_______________3|_____98
Помимо этой записи в базе еще создаются записи в других таблицах и проводятся определенные расчеты. Скрипт выполняется примерно от 0.1 до 0.6 человеческих секунд.
Цепь должна быть не разрывной.
Мое костыльное решение:
Сервер:
Процессор 8 X QEMU Virtual CPU version 1.5.3 2099.998 MHz
Оперативная память 12019 MiB
ПО сервера: Apache+FastCGI
СУБД: MySQL
DB::beginTransaction(); // начинается неразрывная транзакция
$checkLine = Users::where('line_is_busy', '=', 1)->count(); // проверяем занята ли линия
if ($checkLine) { // если да то кидаем ошибку
return "Линия занята, кликните еще раз, вдруг вам повезет попасть, а то разработчик не знает как тут реализовать грамотно очередь";
}
// если линия свободна то занимаем ее
Users::whereId($user->id)->update(['line_is_busy' => 1]);
//
// здесь выполняется тот скрипт на 0.1-0.6 секунд
//
Users::whereId($user->id)->update(['line_is_busy' => 0]); // освободили линию
DB::commit();
Решение выше меня не устраивает тем, что если первый пользователь нажал на кнопку. Остальные кликают дальше пока не "попадут".
Вопросы:
1) Как реализовать так, чтобы пользователь не получал ошибку, а просто ждал ответа от сервера.
2) В ходе исследования появились мысли, что Nginx подойдет для этой задачи лучше чем Apache. Так ли это? Или в данном контексте это не имеет значения?
3) Можно ли на сервере с такими данными реализовать эту задачу чтобы сервер и СУБД не отваливались?
4) Как можно это синтетически протестировать?
P.S. Я не прошу решить задачу за меня. Я просто сбился немного с пути и хочу подпитаться вашими размышлениями и наводками.
Заранее премного благодарен за Ваши ответы и уделенное Вами время.