通讯服务器离线消息 - 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。此刻: 服务器同时删除这个用户所有离线消息。
客户端不需要发送回执命令。