一直对腾讯做产品的能力比较敬佩的,我们组做消息推送系统,而腾讯的信鸽就是我们学习的榜样。京东很多做产品的思想是跟腾讯学的,而京东很多同事也从腾讯过来的(京东合并了腾讯电商),耳濡目染学到很多东西。
前几天前腾讯的同事给我们分享了《解密腾讯海量服务之道》,讲了几个腾讯开发产品的经验原则,比较受益,遂总结下。
2个价值技术观, 7个技术手段, 4个意识 腾讯的海量服务之道是由2个价值技术观和7个技术手段,4个意识组成。技术价值观是总体思想,意识是我们的态度,技术手段是实现技术价值观的手段或者方法。
CAP理论 理论式系统基础理论CAP为分布式的应用提供了理基础: C: Consistency,一致性;包括三种类型(强一致性,弱一致性,最终一致性) A:Availability,可用性(主要指的是快速获取数据的能力,即性能) P:tolerance of network Partition,分区容错性(亦包括可分布性)
**有损服务经历了3个阶段的演变: **
通过精心细分场景,选择牺牲一部分一致性、完整性,以达到通过较低的成本,能够支持海量服务需求,并且满足服务基本可用。
核心思想就是敏捷迭代, 所谓小步快跑,对用户的需求快速反应。简而言之就是“快速求证对用户猜想”的过程。
许多伟人都说过类似的话:用户往往不知道真正想要什么,而且大多是时间是拿来“试错”的。动态运营就是快速求证对用户猜想的过程,这个过程是建立在以”运营”为中心的设计开发验证模式。
互联网硬件容灾方案:
事故 | 容灾方法 |
---|---|
光纤断/机房停电 | 异地部署 |
服务器硬件故障死机 | 热备 |
网络环境恶劣 | 异地部署就近服务 |
黑客攻击 | DNS建设 |
程序core | 自动拉起 |
服务雪崩 | 负载均衡、流量拥塞控制、频率控制 |
互联网业务逻辑层容灾
互联网业务数据层容灾
在分布式集群系统中,某台设备故障,会造成系统整体的繁忙不可用;在做营销推广时,某个服务单元负载极大的现象会很快蔓延到其它服务单元,最终导致全部服务的不可用;用户群越大,系统规模越大,负载超限的情况扩散的就越快,最终会造成系统整体崩溃。上述现象在自然界用一个最直接的名词就是”雪崩”。
过载保护的四个方法:
负载均衡和过载保护机制很像,其实两者的目地是一样的,即都有效保护后台服务,减轻后台服务的压力,但实现的手段和方法是不一样的。而且即使实现了负载均衡,也是需要提供过载保护机制。负载均衡考虑的是把请求合理分配到后台服务器上。 过载保护考虑的是防止后面的服务器的雪崩。
负载均衡的算法:
负载均衡算法的实现有软件和硬件两种,这里重点分析软件的实现负载均衡的反向代理方式: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理负载均衡能以软件方式来实现,如nginx、apache等,也可以在高速缓存器、负载均衡器等硬件设备上实现。反向代理负载均衡可以将优化的负载均衡策略和代理服务器的高速缓存技术结合在一起,提升静态网页的访问速度,提供有益的性能;由于网络外部用户不能直接访问真实的服务器,具备额外的安全性。
在有损服务价值观支撑下的一种做法:重点接口重点保障,次要接口有损保障,并提供紧急时刻的降级能力,同时在前端设计时,即使降级也能保证用户体验。即不保证完美体验,对非关键路径进行有损,提升系统的可用性。 实现上会结合用户使用场景,根据资源消耗,调整产品策略,设计几个级别的、不同的用户体验。最大程度的保证关键服务的可用性。对应互联网服务来说就是要实现两点:
Set化部署主要为海量服务的运营和部署提供支持,为业务部署建立统一的衡量标准和规则。
SET模型的一个重要特点是较强的自给自足能力,或者说,SET模型在很大程度上是自治的。从这个意义上说,SET模型与集团军也很具有可比性。
SET模型的特点:
Set化部署的例子: Qzone日志TDB仓库设定180A1+20B5+20C1+2B2+23A3为一个Set。
互联网行业的变化很多很快,导致代码发布也很多,因而引入bug的可能性也大了不少,与服务系统的稳定性形成了突出的矛盾。如何解决这个矛盾?如何既能基本保障服务稳定性,又能进行灵活反应、快速发布?
灰度发布的优势: 1. 灰度发布能降低发布出问题的影响 2. 降低发布正常时的用户感知 3. 降低对测试的依赖
灰度发布的维度:
2.按照对象 白名单 Alpha用户 公司用户 用户等级等级 用户号段 其他业务逻辑
立体监控是对一个业务或者系统进行完整的监控,而业务从系统层次上又可以分为接入层,逻辑层,数据层。或者从基础的资源到用户实际体验来划分:
按照上述层次划分,每层需要监控的技术指标如下:
报警 有了监控,还需要有效的通知方式。目前用的最多的是设置告警了。当某个监控指标不正常时,通过向相关负责人发送告警,以便及时处理。但告警不宜设置过多,非关键的或者重复的告警需要考虑去掉,以免告警过多,接收人会对告警不敏感。
大系统小做的核心思想是将功能复杂较大的系统,化大为小,减少模块耦合,降低相关联性,用多个独立的模块来实现整体系统的功能。 总的来说,大系统小做采用的是化繁为简、分而治之,便于开发和迅速实现;同时当某个模块出了问题时,因为相互独立,能将影响降到最低,不至于扩大影响范围。我们在实际工作也经常采用这种方法。 比如电商领域,会把系统分成订单模块,商品模块,售后,物流等模块,每个模块独立实现,互不影响。 再如物流的次日达项目,就按照交易线,物流线,结算线分开,每快互相独立,定义接口,最后把整个系统分解很多小块。 这样做本身容易开发,还有一点就是为以后系统的扩展和做灰度升级提供方便。即可以只灰度发布某一个模块,而不用发布整个模块。
先扛住再优化简单来说就是先保证业务的正常使用,即先扛住,再来优化。因为在复杂的优化工作交付之前,交互中故障模式的数量早就足以磨灭人们的信心。
干干净净可以说是开发人员的一个编程态度。
随着业务的发展: 系统变得复杂,功能更加强大; 服务器/带宽/成本增加; 运营环境如千丝万缕,运维难度增加; 代码风格不一; 用户数量级不断增加…… 这些因素,当其发展到某个量级时,会变得臃肿不堪,耗费相当的人力成本和服务器资源,也难以保障服务质量。这就要求我们:要有勇气和自信重构服务,提供更先进更优秀的系统。
出处:https://baozh.github.io/2015-12/tencent-massive-service-discipline/