Правя известия за нови съобщения. Мисля, че имам нужда от отворен сокет за всеки потребител и сървърът ще изпрати известие при ново съобщение. Искам да използвам socket.io и redis pub/sub. Когато потребителят изпраща съобщения, той публикува това събитие на redis и nodejs сървър, който ще бъде абонат и ще уведоми клиента за ново съобщение. Но в този случай съобщението веднага ще бъде премахнато от опашката и когато потребителят актуализира страницата, която получава, ще уведоми, че всички съобщения са прочетени, тъй като опашката е празна, но всъщност съобщенията не се четат. Как да решим този проблем?
Как да внедрим система за уведомяване в nodejs?
Отговори (2)
Вече направих нещо подобно за многостранично уеб приложение, но сега е едностранично и вече нямам нужда от това:
var notifications=[]
...
socket.on('notify', function(message)
{
console.log('new notification received!');
if(notifications[message.notificationId]!==message.notificationId){
//notification never received in the current page
notifications[message.notificationId]=message.notificationId;
//display the notification code here
//In a closure instead of 3 params in order to keep compatibility with IE
setTimeout(function(){Confirm(message.notificationId);}, CONFIRM_INTERVAL);
}
else{
//notification already received
emitConfirm(message.notificationId);
//or setTimeout(function(){Confirm(message.notificationId);}, CONFIRM_INTERVAL);
}
});
Ако разбирам правилно, всички потребители поддържат уеб сокет отворен с socket.io, всички нови съобщения незабавно се изпращат до всички потребители и се маркират като непрочетени. Проблемът е просто, че ако потребителят опреснява, приложението не знае кои съобщения да маркира като прочетени спрямо непрочетени.
В този случай вашите съобщения могат да имат клеймо за време и можете да запишете клеймото за времето на последното съобщение, което всеки потребител действително е прочел (напр. излъчете събитие за четене на съобщение от клиент към сървър), така че когато потребител опреснява страницата, все още има информация, от която да възстановите списъка с прочетени и непрочетени съобщения.