微信号:AngelaTalk

介绍:感谢订阅,我是朱赟,也叫 angela.头像是我本人(因为总有人问).硅谷 Airbnb 资深程序媛一枚.希望透过女码工的视角为您讲述硅谷程序员的技术和故事.

关于微信的一点思考

2016-09-05 12:24 朱赟

题图:frometta.livejournal.com


可能每个人的手机上都装了很多种聊天工具:iMessage,Google Hangout,Facebook Messenger,WhatsApp,Snapchat …… 但是对大多数人来说,常用的一般只有一两种。


就微信和 Slack 相比,其实应用场景和产品功能是很不同的。所以几乎不具有可比性。但是因为频繁使用这两个聊天工具,发现一个特别明显的用户体验上的差别:当你收到提示你有一条微信消息或者一条 Slack 消息之后,打开 App 能收到微信消息往往比 Slack 消息要快很多。发送消息也是一样。尤其是在网络环境比较差的时候,Slack 消息常常收不到,也发不出去。


这件事琢磨了挺久,自己有一点想法,和朋友讨论后也得到一些启发。也因此找了一些材料来读,挺有意思的。因为在通讯领域我实在是个门外汉,所以就不展开讨论了。以下分析纯属个人想法,有错误和不足欢迎指正。大致如下:


首先,关于存储。微信并不需要在服务器端永久存储用户的 messages,也就是不需要存储任何历史消息(貌似以前备份是可以存若干天)。当你换了一部手机登录同一个账号,或者你在电脑上扫码登录的时候,所有的历史消息都没有。


这就可以极大地简化 Server 端存储的设计,不需要任何 persistency 的支持,只需要一些 transient storage 保证信息的实时 delivery 就好了。例如使用某种 message queue,最好是可以有效地异步处理消息发送的队列。即使是微信群里面的消息,对一条消息的所有接受者(群成员),该队列也只需要保证独立的处理和发送。对于发送失败的消息,可以使用 secondary queue 来防止消息处理的阻塞。


Slack 则不然。你在任意一个用户端登录,都会 load 相应的历史消息(对然大部分时候只需要 load 最新的 N 条消息),因此 server 端就需要永久存储这些消息,那么就会涉及到怎么建表,怎么加索引,怎么做备份,怎么做 sharding,怎么做缓存等等等等,那么每条消息的发送和接收,就不是简简单单的传送。


并且,Slack 允许任何时间对任何历史消息进行修改和删除(付费版,免费版似乎有条数限制),而微信只能在两分钟内撤回发出的消息(微信消息删除选项并不是真正的删除,它不影响该消息在对方 client 端的显示)。如果历史消息的存储仅仅为可读,那么系统的设计就又可以简化,然而支持任何时候的修改,这样,系统架构,尤其是存储层的架构的设计自然就会更加负责,很多实现细节必然会影响消息发送的速度。


此外,关于通信协议。微信和 Slack 的通信协议很不一样。Slack 的消息中可以带一些命令,如 /invite,/leave,/feed,/open 等等。因为需要支持这些命令,协议本身必然比较复杂,需要很多的冗余和协议 payload。而为了支持这些协议中的命令,其处理速度必然有影响。


在通信协议上,微信还做了很多弱网络环境下的优化处理。包括基于于传统方案(如快速重传、HARQ 等)的一些改进的方案如 QUIC 等(链接1)。这些方案有效地解决了无线网通讯中的一些如误码、丢包、延迟等问题。此外,渐进式图片传输等技术的使用也一定程度上缓解了一些图片文件传输的延迟。


还有别的,欢迎补充。


最后,关于产品特性的一点点思考。最近自己做的系统上,也遇到了类似的问题。为了支持一个看似很简单的特性,导致了整个系统的设计在很大程度上被复杂化。产品的取舍是如此的重要和困难,在可能的情况下放弃一些,加强一些,会有完全不同的结果。比如微信在用户更在意消息传输速度和一致性上做得比别人好了一点点,就有可能赢得更多的用户。


PS:最近工作比较忙,更新我尽力而为吧。感谢你一直的陪伴~


链接1 — 微信客户端怎样应对弱网络 by 叶润桂:http://www.spring316.com/documents/gmtc2016-%E5%BE%AE%E4%BF%A1%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%80%8E%E6%A0%B7%E5%BA%94%E5%AF%B9%E5%BC%B1%E7%BD%91%E7%BB%9C-%E5%8F%B6%E6%B6%A6%E6%A1%82/

 
嘀嗒嘀嗒 更多文章 也谈代码重构 只为记忆里那一帧风景 论一线技术领导者的基本素养 New Grads 求职到入职,话唠碎碎念
猜您喜欢 12个鲜为人知的CSS技能(上) 写履历表 让我们发展纯粹的金钱关系吧! 影楼后期处理技巧及流程2 【政府】利用云计算助推电子政务云