一直以来,我都对微信的设计有点疑问。
1、微信登录pc端只能通过手机扫码登录。
2、在你更换设备之后,微信的聊天记录完全无法同步,也无法感知是否被好友拉黑。
3、两个同在澳大利亚地区的人进行消息通信几乎瞬间收到。
首先为了满足第三个条件,假想微信在国内建立单点的服务器,那么这种性能一定不足以支撑澳大利亚内这么快的通信,我的猜想是微信是分布式的,在各地都有它的服务器,每次进行消息通信都是由附近的服务器去处理(澳大利亚的服务器之间通信),此时就涉及到了服务器选择算法,你要和好友构成通信,此时就涉及到了服务器查找算法,当建立连接之后你俩就可以互相通信了,可是此时就会出现一个问题,当我坐飞机从北京飞到加拿大,我的手机全程保持关机状态,到达目的地之后打开微信,此时又是怎么拿到消息的呢?此时微信发现发现原有北京微信服务器已经延迟实在是太高,触发了服务器选择算法。服务器重选后,我很快确定了要连接到新加坡的服务器。但是微信的消息并不会广播满整个分布式集群,新加坡的微信服务器实际上并无法得知我的未读消息。所以必须需要一个服务器端切换算法来实现将我在北京服务器上的未读消息同步到新加坡服务器上。
然后此时第一个问题就很好解释了,如果微信支持密码登录,当我的手机和电脑所在服务器不同,手机上就再也收不到消息了。
微信的聊天记录完全保存在本地,这就可以解释第二个问题:为什么换了设备后聊天记录会全没?因为服务器只是一个中转、传达、暂存功能。在你更换设备后自然本地没有这些数据,就全丢光了。而你扫码登录pc端的时候,最近的聊天记录是由你的手机同步到电脑上的,因为此时服务器根本就没有存取你的聊天历史。微信的好友列表是怎么维持的?换了设备,好友列表也能正常同步,所以好友列表应该并不是只存本地,而是存在于服务器上的。接下来解释下好友拉黑问题,当你被微信好友拉黑时,实际上并没有发出一条消息,所以你的本地的消息历史中,仍然存在有和拉黑了你的好友的消息记录,就像Email发送者即使Block了你的Email,你仍然能够看到你们的聊天历史一样。自然这种设计,就导致你无法得知这件事了。只有在你尝试发送消息时发送失败了,才能证明可能他已经不再想和你说话了。 类比QQ,QQ是有完整的多设备同时登录、聊天记录跨设备同步、QQ群的保持和搜索等这些功能的。它更大的可能是一个集中式的部署,靠强大的负载均衡和运维能力支撑这一个数据中心正常。如果你在澳大利亚聊QQ你会发现一条消息要转半天,所以某鹅这样设计微信是有它的道理的。
谢谢观赏