Закрыть
Yoku » Стена » Запись
Народ... ...можно вопросик? Всего... ...один.

Кто. Ответственнен. За уведомления?!

Для тех кто не понимает проблемы сейчас поясню со своей стороны который в вебе ВООБЩЕ ничего не понимает.

У нас клиент тупо делает каждые 10 секунд пулл запрос за уведомлением и когда получает ничего падает в ошибку, и после идёт по второму кругу.

И мы вроде как это всё в КЭШЕ КЛИЕНТА ХРАНИМ НЕ?! Ладно... ...а почему номер то 400, а не 200-204?

Может я ИДИОТ, не спорю. Но по моему это не так должно быть!

-Окей, умник. Критикуешь - предлагай.
-Предложу, правда распишу на языках D и CoffeeScript если вы не против. Хотя... ...а я вас и не спрашиваю! Что знаю, то и применяю!

Смотрите, я бы сделал так чтобы клиент отправлял запрос, а сервер принимал, но удерживал до тех пор пока не придёт уведомление, и выставляем таймаут в размере условно 25 секунд. Если ничего не пришло, делаем паузу и повторяем запрос. Если пришло событие то отправляем на клиент тот обновляет данные на странице.

А теперь перейдём к ПСЕВДОКОДУ.

Начнём с сервера:
/* Обработчик запросов */
void longPollHandler(HTTPServerRequest req, HTTPServerResponse res)
{
int userId = req.session["uid"].get!int;
auto deadline = Clock.currentTime() + 25.seconds; //Тайм-аут

while (Clock.currentTime() < deadline)
{
auto rows = db.query(
"SELECT id, text FROM notifications
WHERE user_id = ? AND is_read = 0
LIMIT 5", userId
);

if (!rows.empty)
{
res.writeJsonBody(["ok": true, "items": rows.toJson()]);
return;
}

sleep(2.seconds); //Вот наша пауза.
}

/* таймаут */
res.writeJsonBody(["ok": true, "items": []]);
}

И клиент:
poll = ->
$.ajax
url: '/api/notifications/poll'
method: 'POST'
timeout: 30000 # ВНИМАНИЕ! ЗНАЧЕНИЕ ДОЛЖНО БЫТЬ ВЫШЕ ЧЕМ НА СЕРВЕРЕ!

success: (data) ->
if data.items.length > 0
renderNotifications data.items
poll() # Переподключение

error: (xhr) ->
setTimeout poll, 5000

poll()


Не знаю что я тут нахимичел, но вроде это так должно выглядеть... ...я же сказал, я не то чтобы веб разработчик, я просто исходил из логики и возможностей. Критика - ПРИНИМАЕТСЯ! Но если она по делу.
Показать больше
Пожаловаться  |  Поделиться

Комментарии (10)

Сначала старые
https://github.com/OpenVK/openvk/pull/1577
проще зайти в гитхабик и узнать в чём дело
Влад Фамильный, Приму к сведению, спасибо. Хотя в подлинности написанного мной бреда я всё ещё не уверен.

UPD: Просмотрел, спасибо за пулл, плюс один повод учить мне PHP. :)))
Если не принимать пулл во внимание, разве long poll не может привести к тому, что можно создать несколько запросов на проверку уведомлений, держать их открытыми и достичь максимума открытых дескрипторов? Это напоминает мне https://en.wikipedia.org/wiki/Slowloris_(cyber_attack))
Compila, Ну любой такой пулл для меня выглядит весьма костыльно, но как я и сказал ранее, я в вебе не спец. Я просто вкурсе что нет общего пространства памяти у HTTP протокола, от чего и кручусь. Но вроде есть SSE или как эта штука называется, которая да, тяжелее в реализации, но это уже прямо безопасно и быстро на работу. Но даже так, хотя был бы длинный пул который бы в консоле не делал бы всякое, а на кэш так бы не садил.
Про SSE я слышу впервые. Спасибо. Однако браузеры не решились исправлять проблему, а проигнорировали ее:

> SSE suffers from a limitation to the maximum number of open connections, which can be especially painful when opening multiple tabs, as the limit is per browser and is set to a very low number (6). The issue has been marked as "Won't fix" in Chrome and Firefox.

Я думаю сейчас часто используется WebSocket, но не знаю поддерживают ли его старые устройства...
Compila, Ну... ...я думаю это наверное от сервера должно зависеть наверное, а клиенту лишь бы всё показать я думаю. Не знаю! Но буду рад получить конструктивный ответ:)
всмысле вы уведомления мне вручную пихаете? почтальоны?
Constantine Gribenyuk, Ну по сути каждые 10 секунд приходит новый голубь и тут же улетает. А если ничего нет то тут же улетает с точки отправки.
Yoku, просто я подумал нужно все время вручную запрос отправлять ибо ты сам написал падает в ошибку
Constantine Gribenyuk, В целом нет... ...но всё сделано из рук вон плохо... Оно же тупо память жрёт своими логами.

Действия