[Whatsapp] chat thread 如果queue里的消息在deliver的时候发现用户不在线了如何处理?

corner case:
在enqueue之前 我们发现用户还是在线的 但是在deliver的时候突然发现用户已经下线了 消息无法deliver那么我们应该怎样处理呢? 并且如何保证消息的有序性?

发现下线的话,需要把消息再写回到缓存和数据库。
消息会带有时间戳,下回拿的时候按时间顺序拿就可以了。

我的意思是消息队列已经有消息。A->B->C->D 发送消息D的时候 发现用户下线了 然后D就被存到缓存了,但是发送C的时候用户又已经在线了 那么C就被顺利地发送了 那D的顺序不就不对了吗?

如果发送到 D 的下线,消息进到缓存的时候,该用户在接收方会在一个之后的时间上线,上线之后会先去缓存和数据库中读取之前错过的消息,读取完了以后才会开始接收消息队列里的消息。也就是说在 C 顺利发送出去之前,D已经通过缓存和数据库发送给用户了。

重新上线的user, 是poll DB里的message, 但是messaging service 是push message。 如果push的更快的话, 岂不是先display了 C, 然后才poll到D, 那顺序不就乱了?

除非这个poll 跟 push 要synchronize 一下?

我看微信在收取消息的时候就没有这个问题,我猜他们在messaging service 是push message的时候可能先缓存到了客户端,应该按照时间做了一下排序。

message service 只会在消息产生的时候尝试 push,如果用户不在线,就存起来靠之后 poll。正在 push 过程当中的消息是 poll 不到的,我觉得是不会出现竞争的情况的。