• Feeds

  • Archive for May, 2012


    微信架构的启示

    腾讯大讲堂中最近分享了周颢演讲的微信技术总监解读微信架构的秘密,看完视频的一些心得。

    技术微创新

    微信的技术设计上有很多微创新,看起来都很小,但是对于系统的稳定性、用户体验及开发敏捷都具有重要作用。

    前轻后重
    由于客户端升级不便,从技术设计上尽量利用后端的设计来减少依赖客户端升级的方法。如某个版本新增了群聊功能,按常规思路,需要所有客户端升级才能全部打通。微信采用服务器兼容的方法,在老客户端不升级情况下让其增加群聊的功能,通过在服务端将群聊协议转换成之前旧版兼容的协议返回给老的客户端。

    客户端辅助设计
    微信客户端做了很多非常规的功能,比如常规的客户端测速方法是登录阶段轮询测试多个IP来选择服务器,这样会带来流量及登录速度双方面的开销,因此微信选择的方法是服务端返回最佳的IP(可能是通过历史数据分析)。客户端另外实现了一些容灾能力的配合,当一个IDC访问出现异常自动选择另外一个IDC。

    流量控制
    由于大部分无线用户对流量非常敏感,为了防止由于客户端不可预知的bug如死循环导致“偷流量”,服务端增加用户流量实时分析的方法,可以在海量数据下找出流量异常的用户,并给这些用户强制下行终止连接信号。

    基础研发的策略

    从视频介绍来看,微信的基础研发与业务结合非常紧密,提到的有基础组件比如Client/Server框架,从原理上看类似Twitter Finagle,框架封装了大容量网络通讯及远程调用所需各种功能。此外介绍的一些监控与统计框架也较为先进,可以随时增加监控指标。

    大量可复用的基础组件让业务开发非常敏捷,周颢总结的基础研发策略是“实现已有经验的固化”。这和其他一些公司中的基础研发团队思路有所区别。业界中基础研发脱离生产闭门造车的情况并不罕见,一方面业务部门重复低层次开发现象严重,另外一方面基础研发对业务理解欠缺,开发的组件模块与业务结合不紧密,无法被有效利用。因此类似微信这样增强业务团队的力量,在开发业务同时总结抽象更多的基础组件或许是一种更为实用的发展思路。

    腾讯海量课程

    视频中多次提到腾讯内部的一种海量模型的培训课程,其中的经验或设计模式包括
    大系统小做
    将一个复杂的大系统分解成多个独立的、小的、简单的任务去完成,“分而治之”。

    柔性可用
    服务端系统通常不是0与1之间的选择,可以在极端情况下做一定优雅降级,在服务端代码中需要体现这些设计。

    Set模型
    类似最近讨论的cell架构,按一个服务按用户范围分成不同的小单元,每个小单元(cell/set)具备全部业务服务能力,当一个set发生故障时候,只会影响这一小部分用户。微信架构中所做的补充是,在set之间增加了容错处理,当一个set发生故障时,使用类似一致性哈希的算法,调用方可以自动切换到下一个set来存储,并且将新的位置记录在index上(类似GFS master),周颢自称是一个简化版的GFS。

    微信的协议

    里面提到了XMPP和类Sync的自定义协议,里面提到XMPP的缺点是流量大和消息不可靠。但是流量大并非XMPP主要矛盾,可以很简单将其映射成二进制协议。消息ACK也可以添加简单的扩展协议来实现。较繁琐的还是兼容CMWAP网关的设计。

    使用XMPP或者简化的XMPP标准协议有很多好处,类似的场景有业界广泛使用的open api基本都使用HTTP及JSON,并不是由于这两种协议优化或高效,而是其简洁并得到广泛的认知。一种标准协议的认知及扩展成本要比一个自定义协议小得多,XMPP流量大的问题可以通过转换协议来实现,比如用binary 1代表login等全部协商协议,2代表message,消息增量获取也可以通过自定义扩展协议来实现。标准协议可以让团队内部及新人的认知成本降低,每一个参与者都很容易想到代码及架构改进建议。而且微信目前也在构建开放平台,自定义协议在开放方面必然具备一些局限。

    其他

    分布式理论
    从微信的分享也看到,指导业界不同背景的团队(不管大小)的分布式理论主要还是Google及Amazon系列论文,对互联网技术的发展具有深远影响。微信借鉴了Quorum及Merkle tree的理论,创造了一种自定义的做法,用于实现一种分布式递增发生器。
    不过分布式递增算法其实有更简单的实现方法,twitter也有相关的公开博文,由于视频相关背景介绍比较简短,可能大家解决的需求具有差异,就不展开了。

    监控
    数千的监控项,可以在分钟发现系统的异常

    敏捷
    每天20个后台变更

    技术传承
    从视频和PPT来看,微信的技术体系是从头搭建的,可能有不少利用qqmail时代的基础代码,但与深圳团队并不存在太大技术沿袭或者传承关系。从另外一个角度也看到微信技术团队的战斗力。

    新人力量
    一位毕业生的创意:按SET分布,全量数据从2G减到200K(具体的情况待了解)
    另外一个新特性,漂流瓶及摇一摇,据说也是2个月的本科毕业生一周完成,而且上线后运行稳定。

    存储

    上图中可扩展设计中字段配置表的做法感觉略显繁琐,目前大部分NoSQL产品的schema free方式可能更易于维护。

    产品驱动

    如图,其中“允许发布十分钟前的变更”这样做法通常在大型团队通常会引起广泛质疑,单纯学习这种形式并非正解,如何在互联网产品上实现敏捷值得产品和研发进一步思考。

    MacBook Air与工作效率

    从MacBook Pro转向MacBook Air已经数月了,谈下使用Air之后带来的便利与效率提升。

    便利

    虽然进入云计算时代,由于国内网络环境原因,访问国外一些知名云提供商并不稳定。因此在相当长一段时间内,国内用户依然非常依赖本地存储,使用轻便笔记本是一个最佳的选择。随时随地使用同一个工作环境后,可以极大改善个人效率及体验,以下是使用Air之后带来的一些日常便利。

    • 浏览器标签页打开的未读完文章可以在其他环境继续阅读,这个对于工作环境中时间经常碎片化的人员非常有利。未看完的文章不需要收藏到类似“Read Later”的工具中,而且ReadLater之类的工具更大的障碍是,一个页面在粗读完之前,无法判断是否需要收藏。
    • 由于是SSD,启动程序及打开文档速度非常快,几乎不需要等待。
    • 由于Air很轻,特别是11英寸也非常小,可以用方便随身携带,不需要为“今天是否要带走”思考。
    • 可以坐在床上、沙发、公园、咖啡厅或者其他随意的地方编写代码或者文档,不会感觉压腿、发烫或者沉重。
    • 使用Air可以忽略开关机的问题,可以象使用iPad一样打开即可使用,用完之后盖上自动sleep。几个月未重启过的情况在MacBook系列中很常见,由于Air在sleep时候,不存在传统硬盘碰撞风险,因此相对而言是非常安全的。
    • 办公台式机与移动的结合。使用一个蓝牙键盘与鼠标,接上外接显示器,MBA无需打开,变成了一个真正的台式电脑,下班时,拔掉显示器,又变成移动设备带走

    性能

    大部分工作如上网浏览、编程开发、编辑文档、常用办公软件都非常流畅。但是有几个补充的问题

    • 内存占用。在同时打开Safari多个页面(尤其是含有Flash的页面)后,4G内存通常会用完,在Activity Monitor里面可以看到Swap used占用大小,但是由于SSD存储的缘故,对实际使用影响并不大,传统硬盘中出现内存Swap时,切换程序的顿卡现象在Air上基本不存在。
    • 发热现象。由于Flash占用CPU及内存较大,在访问Flash密集页面时会出现风扇声音变大情况(未证实是否普遍现象),需要经常在线浏览Flash视频的可能不太适合Air,但是所有Mac系统都有此Flash性能问题。播放其他视频格式(如本地rm, mkv等格式)不会出现CPU过高现象。

    其他问题

    • 配套设施。MacBook Air可以当做唯一的电脑使用,无需额外购买“更强大”的台式机。考虑到大部分笔记本电脑键盘及屏幕并不符合人体工学,在办公室使用及家中购买外置显示器如(DELL UltraSharp)及蓝牙鼠标及键盘,很方便就将MBA转换成一个工作台式机,同时也会带来体验及工作效率的提升。
    • 键盘。键盘的缺点是第一行功能键较小,受影响的是经常使用的ESC键,可能会稍有不便。
    • 电源。MacBook Pro的L型电源可以直接用于Air(反之则不行),不会存在“电流过大”的情况,可以参看官方说明。基于 Intel 的 Apple 便携式电脑:识别正确的电源适配器和电源线

    基于 Intel 的 Apple 便携式电脑的电源适配器有 45W、60W 和 85W 三种功率规格。尽管一般应使用适于 Apple 便携式电脑功率的适配器,但仍可以使用更高功率的适配器,而不会出现问题。

    例如,如果您具有通常使用 60W 适配器的 MacBook(13 英寸,2009 年末),则也可以将 85W 适配器用于该电脑。不可将 45W 适配器用于该电脑;它无法为该 MacBook 提供足够的电力。注:使用功率比电脑所附适配器高的适配器不会加快电脑的充电速度,运行方式也不会异于使用电脑附带的适配器。

    11还是13英寸

    对比11与13英寸MacBook Air,由于11英寸的键盘宽度和13英寸基本没有区别(13英寸增加的是屏幕高度),日常输入并不存在局促之感。13英寸主要优势在屏幕尺寸,如果在工作环境用外置显示器,则11英寸并不会带来显示的不便,却会带来移动方面质的飞跃。

    实际13英寸真正的优势是有大一倍的SSD容量,因此需要在存储容量及便携性方面做取舍。由于便携性带来的个人效率的收益,因此建议用11英寸,不常用的文件如视频、照片可以备份到外置存储上。

    案例

    有一些误解认为MacBook Air不适合工程师,下面分享几个技术明星使用Air的案例。


    据说Linus Torvalds从2005年开始使用Mac作为主要工作机器,最近也转向轻薄的MacBook Air,以下是Linus在Google+上的一段话 https://plus.google.com/102150693225130002912/posts/1vyfmNCYpi5

    I need to find a new distro that actually works on the Macbook Air…

    另外一个案例是Redis作者antirez的一篇文章Why the MBA 11 is now my sole computer

    When Apple released the first version of the 11″ Macbook Air (Late 2010) I purchased one within the first week of the announcement, and my computing experience changed.

    Notes about Timelines @ Twitter

    Twitter timeline团队负责人在QCon London上分享了一篇Timelines @ Twitter的演讲,以下是其中一些摘要。

    数据

    1亿活跃用户
    Timeline接口2万QPS
    推送平均1ms,99% 4ms以内
    每天2.5亿条新Tweets,平均3千/秒,峰值1万以上。
    每天260亿次分发,每秒1800万(从中看出平均关注100人)
    投递100万粉丝的时间需要3.5秒,每秒可投递28万

    架构

    材料中以介绍推(fan-out)为主
    对于followers多的用户,从fan-out上采用pipeline的方式并行投递推送,每个任务负责分发4000个粉丝

    fan-out首先投递到timeline cache上(page cache?)
    用户收件箱采用redis存储,Redis只包括活跃用户,冷用户随时间过期
    使用Redis的list数据结构,每个item中还包括tweet ID, user ID及标志位3个字段
    使用Redis RPUSHX来避免写入冷用户
    对于频繁访问用户的timeline, 设置in-process cache(local cache)
    fan-out及fan-in的比较如下

    技术选型与演进

    Redis,使用了Redis来代替之前的memcached来存储vector cache
    Thrift, 内部调用已经基本使用Thrift方式服务化,参看P109
    Scala,内部服务基本使用Scala实现,但搜索模块使用Java实现,视频Q&A中提到
    Finagle,较多篇幅介绍,是一个Scala实现的网络库,基于Netty框架的基础上