Доброй ночи! Есть задача показывать большое кол-во данных из базы. Есть N пользователей, которые могут изменять цену в уже существующего в системе продукта. Чем меньше цена, тем выше в списке поднимаеться товар с ценой конкретного пользователя, относительно тех же товаров с большей ценой, других пользователей.
Каждый раз как 1 пользователь обновил цену - эта информация должна обновиться у всех пользователей.
Я вижу это так, человек выбралд товар и добавил цену. Если этому товару впервые присвоена цена от конкретного пользователя. То я беру запись в базе, котороя относиться к этому пользователю и с помощью веб сокетов, отправляю ее всем пользователям. Кладу ее в html5 storage, потом беру все данные, которые уже есть в storage и изменяю их, потом обновляю html.
Другой вариант, генерировать partial view на сервре и отправлять его всем пользователям. Делать это каждые 2-5 секнды, использую setInterval на стороне клиента. Но тогда нагрузка на сервер будет во много раз больше. Да и опрашивать сервер с клиента, через заданный интервал времени, скорее всего не очень хорошая идея.
Штука в том, что у всех пользователей, информация должна обновляться одновременно. И как такое делали раньше, до того как появилась возможность, хранить все на стороне клиента в браузере? И правильно ли это, хранить данные на клиенте,а по необходимости, просто дополнять их или удалять. Может быть, есть другие методики, благодаря которым я могу все отфильтровать, сортировать на сервере и отправить все эти данные клиенту, а там просто отрисовать все это дело? Ну и веб сокеты не очень подойдут, для отправки больших сообщений, да тот же пушер, имеет ограничение в 10КБ для одного сообщения.
Подскажите пожалуйста, как правильнее всего это дело реализовать? Спасибо!
В сокет вы можете посылать просто событие с плейлодом {action: "UpdatePrice", payload: {ids: [1, 2,3]}}
А на основании этого события система будет знать что надо сходить на сервер за новыми ценами и делать это обычным ajaj запросом, выбирая все данные или только обновлённые.
Андрей Бойченко Про локалсторадж я не совсем понимаю зачем он вам. Если у вас одностраничник без перезагрузок, то данные обычно можно хранить в памяти (переменная, redux и т.д.) Но у меня слишком мало информации о вашем кейсе, чтобы давать советы.
Вячеслав Плиско, смотрите, первый пункт - это минимальная задержка с обновлением информации. Чем меньше, тем лучше. Нужно, чтобы все клиенты получали обновленную информацию одновременно.
Основная идея в том, что может быть, скажем 500 клиентов и 3000 товаров = 1500000 записей в базе и мне нужно эту информацию выдать всем 500 клиентам, без задержек и так, чтобы сервер не захлебывался. Я не могу сделать, что-то вроде - select * from table, отсортировать и отправить эти данные клиенту, по скольку - эти данные могу иметь огромный размер. И быстро передать их клиенту не получиться. Более того, я не понимаю как можно передать большое кол-во данных асинхронно, очевидно, что тот же пушер может вместить в себя 10КБ информации, а данных в базе, может быть на 2,3-20Мб.
Вообщем, нужно быстро, отобразить все данные из базы и обновить их у всех клиентов, сразу как только хоть один из клиентов изменит цену
Ваша задача решается просто:
- Клиент обновил цену
- Записали новое значение в базу, всем остальным клиентам послали сокет с данными:
{
id_товара: новая_цена
}
- Когда браузер получил сообщение в сокет - через js обновили значение цены в нужном HTML элементе
- Таким образом после изменения цены в базе, у всех клиентов сразу отрисуется новое значение
Ну мне ещё нужно изменить положение клиента в общем списке. А значит нужно хранить где-то всю информацию, потом обновлять ее и перерисовывать ui всем клиентам. Все время делать запрос с базы не вариант, не буду же я на каждый чих по 100к записей выбирать из базы, одним скопом и отдать это дело всем клиентам. Вот и стоит вопрос где все это хранить да так, чтобы в тот же миг передать обновленные данные всем клиентам.