• Feeds

  • Archive for the ‘架构’ Category


    基于分发机制的公众订阅平台设计


    如下图所示,一个基于分发机制的公众订阅平台,是指一个移动信息发布系统,可提供订阅功能的系统企业帐号可以给所有的订阅用户按照一定的条件(如地域或用户特征)群发消息,系统的主要关注点包括

    • 分发的throughput。由于群发的放大效应,如何让拥有大量订阅用户的企业帐号能及时投递消息。以及到客户端的移动push通道也存在throughput的问题。
    • 存储的性能,根据客户端的访问型态,如果考虑数据保存在云端,大多需要更新最近联系人、用户与企业订阅帐号之间的会话索引,以及每个会话的未读提醒数。由于客户端本地也可以保存部分数据,因此不同的实现型态可能云端存储及更新的数据有一定差异。
    • 分发及存储模型。分发指数据投递推拉方式的选取,由于筛选条件及通过移动网络主动push的可能性,推送方式可以更好满足业务型态。存储模型指如何选择合适的模型让上万订阅用户的推送能更及时快捷。

    (图中紫色为可能的瓶颈点)

    从图来看,实现并不复杂,但是当系统规模增大之后,如要达到投递即时性需要考验一些工程能力。
    紫色的三个框都可以用key/list来表达,redis的性能和功能可以匹配这样一个场景,这也是为什么近几年redis会如此流行,但离完美匹配类似场景还有一定距离。

    单元化与分布式架构的切分问题

    单元化是将一个系统的架构按某种数据特征维度进行垂直的划分,比如网站有100万用户,如按照用户维度进行划分,则可以分成10个单元,每个单元存储10万用户资料。单元化的一些收益如下

    • 由于每个单元数据规模可控,相关维度内的所有资料可放在一个数据库中(如上例中的用户资料),不需要复杂的sharding分库分表逻辑,存储及缓存访问得到极大的简化。同时开发也变得简单,工程师不需要有丰富的“大规模大并发系统”开发经验。
    • 同时由于计算离存储更近,也可以让数据离用户更近,比如用户数据存储在地理上靠近用户的位置,数据有了更好的局部性(locality),因此也会获得更好的访问性能。部署上相关单元的前端、缓存、数据库、数据挖掘等节点可在同一个机柜,架构上让大数据的访问变得低廉,也在部分程度上让大数据更为快速及敏捷。
    • 可以自然支持不同用户分片支持不同的功能特性,天然的A/B testing试验场。

    分布式是将一个系统的数据分布到多个单元,以便使系统能够scale out,具有更好的可扩展性。当今大型网站基本上是分布式设计的。分布式系统除了机房内的,考虑到系统扩展性、用户访问的便捷性、机房规模的物理限制、异地容灾(比如2013年4月及8月的微信机房故障)等需要,大型系统也会考虑地理分布在多个机房。

    但是在社交网络中,由于数据的网状访问,单元化会碰到较难选择合适的单元化切分维度的问题,比如按用户或按内容进行单元化不能很好的适应数据访问局部性的问题,同时地理分布式也面临相似问题,由于社交网络中用户的页面需要访问的,所有地理分布的机房都同步需要全量数据,导致部署和维护成本较高。

    假定系统中存在一个跨单元的数据访问总线,并且总线的访问满足

    1. 局部性,单元内的访问,大部分的数据可以在单元内命中。
    2. 封装性,单元内的应用程序使用统一的方法访问数据,不需要关注数据的具体位置。

    那么这个数据总线应该如何设计?放在哪个层级比较合适?比如service layer, cache or storage(e.g. Google Spanner)?

    享受造轮子的乐趣

    在业内,由于技术布道师的传播,“重复造轮子”成了一个讳莫如深的话题,一个新的项目在各种讨论场合总是会小心翼翼的避开这方面讨论,一旦触及则会马上描述自己系统的独特性和必要性。富有经验的项目管理者,通常在开工前就会想好各种质疑的应对。但是造轮子也并非是一个雷区,有时候造下轮子也是无妨,不必遮遮掩掩,真的需要考虑清楚的是,轮子为了KPI、晋级、虚有的声誉,还是真的出于兴趣及热爱?他们是否可以放在阳光下,和另外一个社区的产品从技术的角度去比较?

    在Linux起步的阶段,在服务端有高端大气上档次的Solaris,在桌面端有占据垄断地位的Windows,如果抱着不造轮子的心态,也就无法让高高在上的Unix走下神坛,装进每个学生的学习的电脑,也不会成为最经典的开源协作的项目;在搜索引擎的领域也有同样的故事,一直到最近一两年,还有顽强的公司的不断进入这个领域。设计和使用一项技术就像厨师和美食家的区别,是不同层次的工作与体验。如果你的目标是给用户提供一个更好的操作系统,使用一个引来的产品很难使我们离目标更近。

    在一方面,造轮子可以使我们加深对专业领域的认识,帮助我们重新思考这个领域;而且我们可以根据自己对场景的理解,思考改进原来的实现。更难的境界是REINVENT, 而不是迈出造轮子那一步。

    另外一方面,富有挑战的项目的轮子可以帮我们更好的聚集人才。好一点的公司都在谈人才争夺战,但是大量的公司对于优秀的人才并没有充分施展的空间。Where Should Top Coders Work?也提到了类似问题,顶级的开发人才希望能发挥自己的才智解决业界最棘手的问题,因此在这些挑战的项目周围聚集优秀的人才之后,就有更好的机会通过创造项目中的智慧,发挥技术的杠杆作用去推动业务。

    但是也得强调几句,同一厂中的重复造轮子不值得鼓励,技术团队在造轮子时候得把握好优先级及时机,在农闲阶段造轮子,农忙阶段发挥作用。