whatsapp的message service怎么forward消息给另一个message service

whatsapp的message service需要forward消息给另一个message service,他怎么知道要forwad给哪个msg service? 他需要maintain msg servcice和user的对应关系吗

对 需要有一个 connection cache/db 存储用户与 message service 的对应关系。

请问这个对应关系具体是谁来maintain的呀? 还是message server吗 or websocket server or else? 谢谢。

这个对应关系由 connection db/cache 来 maintain。Message service 根据 user id 到 connect db/cache 里读取 websocket session 以及保持这个 session 的 websocket server 的信息。

我看了一下文稿,Messaging Service 系统设计题解

之前是每个用户有一个单独的队列,现在是大家共用一个队列。每个用户有一个单独的队列有什么不好呢?是比较消耗内存吗?

这里我有点搞糊涂了,这个message service应该有几个呢?之前的版本很清楚,就是一个。现在的版本有两个message service了?

还是只有一个message service,但是用了share的 message queue,比如说是rabbitMQ?

文本课的图 out of date 了。

课上这点讲得很清楚了,既不是每个用户一个队列,也不是所有人共用一个队列,是按照 recipient id 来 shard。就是每个队列有多个被 shard 到同一个队列的用户。每个用户一个队列会有大量的 queue build up 和 tear down,效率很低且内存消耗大。

在前后两个版本里都是用多个 message service,单机不能支持这个 QPS 的。Message Service 不止两台,需要几台就加几台。

Message Service 和 Message Queue 分别都有多台,每台 Message Service 每次接到 Request 都会跟 Message Queue Cluster 通讯,具体分到哪个 MQ 就看 Recipient ID 了。

1 个赞

我看视频上讲的是用Presence Table (userID, last_active_ts, websocketServerID)可以来找userID -> websocket server ID. 对吗?

对的,是这样的~

谢谢老师的回答,我确实之前有点搞混淆了。

一般来说 Message Service就是对应一个endpoint,这里说的“Message Service 和 Message Queue 分别都有多台”,我觉得这里指的是Message Service Instance有多台吧?一般来说 service只有一个吧,有多个 Service的 instance?

但是他们对外还是share同一个endpoint?对内是有一个internal load balance去route request?

谢谢老师的回答,我确实之前有点搞混淆了。

一般来说 Message Service就是对应一个endpoint,这里说的“Message Service 和 Message Queue 分别都有多台”,我觉得这里指的是Message Service Instance有多台吧?一般来说 service只有一个吧,有多个 Service的 instance?

但是他们对外还是share同一个endpoint?对内是有一个internal load balance去route request?

是的,是指单一service有多台机器,share endpoints