Народ... ...можно вопросик? Всего... ...один.
Кто. Ответственнен. За уведомления?!
Для тех кто не понимает проблемы сейчас поясню со своей стороны который в вебе ВООБЩЕ ничего не понимает.
У нас клиент тупо делает каждые 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 секунд пулл запрос за уведомлением и когда получает ничего падает в ошибку, и после идёт по второму кругу.
И мы вроде как это всё в КЭШЕ КЛИЕНТА ХРАНИМ НЕ?! Ладно... ...а почему номер то 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()
Не знаю что я тут нахимичел, но вроде это так должно выглядеть... ...я же сказал, я не то чтобы веб разработчик, я просто исходил из логики и возможностей. Критика - ПРИНИМАЕТСЯ! Но если она по делу. Показать больше