Нужен совет по вебсокетам?

Ребят, добрый все вечер! Сложилась следующая ситуация, я пришел в проект на котором происходит следующее.
В определенное время суток, люди выставляют товары, а потом в общей таблице, где видны все поставщики они меняют цены на своих товарах . Суть в том, что каждый их них хочет попасть на первые строчки, а это возможно, только уменьшая цену. На данный момент, прошлый программист сделал так, что с клиента посылает запрос на сервер каждые 4 секунды, генерирует на сервере вьюху и отдает клиенту, а аякс ее отрисовует. Но такой подход создает колоссальную нагрузку, особенно если учесть, что на страницу выгружаються сразу все записи из базы. А их количество варируеться в очень большом диапазоне, от 50 и до 500 записей, прям лекго. Все это дело выбираеться одним запросом ии так каждые 4 секунды. В конечном итоге сервер просто ложиться, даже когда сидит 2 человека начинаються проблемы.

По факту один клиент делает 15 запросов в минуту, в среднем, клиентов около 15. Но дальше их будет только больше. Но даже, когда их 15, мы получаем 225 запросов в минуту.

Если я правильно понимаю, все это дело лучше сделать на сервере и отдавать сразу всем клиентам. И тогда у меня получиться всего 15 запросов в минуту. Результат одного запроса будет отрисован сразу 15 пользователям.
Но есть проблема, если использовать pusher то там лимит на размер сообщения 10кб, у Ably лимит 64кб, но можно сделать 256кб на enterprise плане за овер дорого. Но проблема в том, что этого не достаточно, на данный момент, чтобы ответ от сервера, который отрисовуеться с помощью аякса, весит 1.2Мб.

Подскажите как правильно поступить с решением такой ситуации, как вообще правильно обновлять информацию в риалтайме, но чтобы это было быстро.

Большое спасибо за любую помощь.
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
Alex_Wells
@Alex_Wells
PHP/Kotlin
Берете socketcluster (если self-hosted) либо любое другое решение (если не self-hosted), поднимаете. Далее выкидываете все, что написал предыдущий прогер. Припиливаете вью, делаете вью компайл на стороне клиента. При заходе на страницу - подписываетесь на канал сокета (напрямую, либо с помощью либы-обложки Echo от laravel), потом загружаете ваши 50-500 записей, а после слушаете в этом канале эвенты ИЗМЕНЕНИЙ каждой отдельной записи. Они же не все 500 одновременно изменяются? Ну и при изменениях отправляете эти эвенты с помощью встроенных средств laravel.

Это самая обычная схема работы сокетов. И тут вам не то что 10кб, а несколько десятков байт должно хватить на каждое сообщение. Конечно, их будет много, но сокеты на это и рассчитаны. Если не хотите платить (но прийдется платить за сервак и админить) - берете self hosted.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Гы-гы-гы, 1.2 Mb 225 раз в минуту?
Отправляйте только записи, изменившиеся после предыдущего запроса.
Убирайте лишние подробности из ответа.
Сделайте свой компактный формат ответа вместо (скорее всего) JSON.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы