通讯服务器离线消息 - housekeeper-software/coocare GitHub Wiki
机制
首先,离线消息只针对用户端,工程师端没有。
工程师端给用户发送消息,每条消息都会缓存到 redis off:uid的哈希表中。插入消息的时候,会用当前服务器时间戳生成消息id,正文就是工程师
发送给用户的消息。同时,消息会根据正常的流程发送给在线用户,或者经过推送。
服务器在消息中消息的control字段附加了内容:
base::DictionaryValue root;
root.SetString("msgid", msgid);
std::string str;
base::JSONWriter::Write(root, &str);
to_message->set_control(str);
客户端解析control字段,并读取msgid,然后需要给服务器发送确认消息,以便服务器删除已读的消息。
发送的消息格式如下:
cmd: receipt
control: {"msgid":"xxxx"}
即可。 服务器不再回复。
用户登录
用户登录之后,如果协议版本 >1 则尝试读取离线消息。离线消息在redis中作为集合存储,并没有顺序。
所有离线消息一次发送给登录用户,offline=true。此刻:
服务器同时删除这个用户所有离线消息。
客户端不需要发送回执命令。