大流量活动的应对

大流量活动的应对

大流量活动的特性是生命周期短,推广资源集中,突增流量多,对系统负载有较大的挑战,可能会对现有业务产生冲击。 在有大流量活动上线之前我们一定要做好提前准备,提前预估容量,做好扩容准备,做好应急预案。

容量预估

在确认为大流量的活动上线前需要对活动做容量预估,预估总用户量有多少,用户同时参与的可能峰值是多少?确认后评估系统能力是否能够支撑,如果不能,进行优化或扩容。评估系统时需要考虑系统本身以及支撑系统的服务的承载量。

控制节奏

控制节奏是指控制资源投放量的节奏,要有层次的将资源投放出去,不要一次性将所有资源全部砸出去,以渐进的方式,慢慢放量。如果一次性将几千万甚至上亿的量放出去,可能会导致整个活动的后台支撑系统超负载,从而影响整体活动效果。

关注用户行为

评估时考量用户的行为,识别用户的页面访问路径,如常规的活动只有一个页面,可以直接按用户数评估访问量。 如果活动一个用户一次体验流程可能会访问4到5个页面,而每个页面对后端的cgi至少产生3个请求(2个pv上报,1个用户参与状态查询),则如果有500万用户进入页面,则可能会对后端产生至少2000多万的cgi请求。如果还有页面定制的用户状态区分等,则会有更多的请求到应用服务器。

服务定制

针对大规模推广活动进行定制。此定制相对于常规逻辑来说,去掉与当前活动不相关的旁支逻辑。毕竟相对于整个系统来说,需要考虑的逻辑点会比较全,而如果只是一个活动的话,有些功能是不需要用到的,可以针对这些点做功能优化。可以考虑从入口处直接隔离,或增加定制开关。

业务隔离

承载活动运营的系统现已成为平台性的产品,有较多的业务依赖于此系统,特别是有一些非活动性的,如体系类、固化入口类的业务。 此时,当有大流量活动发布推广时需要考虑到活动本身不会对平台上其它产品产生影响,毕竟大流量活动其访问量级较大,在大资源推广时会占用服务较多的的资源,从而可能会影响其它产品的服务质量。

为保证系统上其它业务的高可用性,我们需要做业务隔离。此处业务隔离的原则:

  1. 代码保持一份,主干开发,保证主干的可用。
  2. 短期和长期的业务隔离,如通过域名分割,大流量短期活动业务启用新域名,直接扩容,流量到新机器。

如果一切顺利还好,但是往往事不与人愿,总会出一些你预想不到的情况,比如之前说好的节奏没有把控好,比如做的容量预估不够,比如……,这些比如都是我们在事前需要考虑的风险点,当这些风险出现时,我们需要做异常应对了。

假设现在流量一下子太大,已经到了服务器的负载极限,有许多用户直接被服务器拒绝服务,此时我们能够做些什么呢? 面对这种情况我们经常做的事情是扩容。

紧急扩容

扩容说白了就是加机器,其主要是考验系统的伸缩性,在不改变其它内容,仅通过增加或减少服务器的数量来扩大或缩小应用的服务处理能力。

由于业务的调用是链式的,一环扣一环,如当我们扩容后,能够应对这些流量冲击后,这个冲击可能就会触达到后端的server,或其它给我们提供服务的第三方服务,可能会一下子把第三方整得服务不可用,因此在紧急扩容前需要梳理我们依赖于哪些服务,大流量的请求中与这些服务相关的有哪些,大概有多少量级的请求会转发到这些服务上,他们的支撑能力有多少,整体容量预估是否够用,并且需要提前沟通。

假如因为某些特殊的原因,而无法扩容。此时为保证大部分用户的服务可用,我们可能需要选择服务降级。

服务降级

当应用访问遇到高峰时,超出了应用所能处理的最大能力时,为了保证整个应用的安全可用,需要进行降级,通过拒绝部分请求及关闭部分不重要的服务将系统负载降到一个安全的水平。

降级服务可以从功能和用户两个维度实现,功能降级需要将系统拆分成独立的若干个功能点,当遇到问题需要降级服务时,保证主功能的可用,一些旁支功能可以先关闭;用户降级需要在服务端实现某种策略的服务不可用,如直接抛弃用户请求。比较简单的实现就是各种系统开关,针对可以降级的功能点和服务使用开关, 当出现需要降级的情况的时候, 就可以在后台使用开关来降级。

服务降级前需要和产品侧沟通确认。

以上忝为某活动总结。

 

活动运营总结

背景

沉默一年,所做活动过百,所见所想,所思所虑。
活动常规化,小组年活动量1000+
人力不足,需求变更多,资源到位时间不定,

基础建设

  • 活动运营,想要快速,就需要有一个强大的运营平台的支持。
    建设:运营平台作为基础建设,需要作为重点投入,在建设过程中,强化运营支撑系统 大系统小做,不停的迭代,专门的产品跟进,与使用者沟通,将系统的开发和活动的开发交替给不同的开发,以调节和深入。另,在人力方面需要确保运营系统的投入。
  • 可扩展性:从运营支持平台的业务框架层面,在适应现有业务发展的基础上增加代码的通用性,在一定程度上保证系统的可扩展性。
  • 监控告警:运营系统的告警不能成为常态,一是可能会形成告警疲劳,从而放过真正的问题,二是告警会影响日常的工作开展,此时如果确认常态的告警是问题,则解决问题,如果是告警系统本身的问题,则优化告警系统。

代码架构

  • 前端静态页面,资源文件,活动隔离,按日期归档,CDN加速。
  • 前端公用库版本升级,不同版本间清晰隔离,不做兼容,固化业务逻辑抽象为公用组件,实现业务的可配置化开发。
  • 数据和页面分离,行为和表现分离,前端和后端分离,后端固化业务,中转接口。
  • 轻重分离,将固化的业务以更高性能的服务实现,将变化较多的业务需求以脚本类CGI实现。

团队

  • 固化业务外包,需要考虑人员的稳定性问题,这是一个矛盾点,并且外包政策需要切合公司的大的政策方向,存在风险点。
  • 新业务主力人员承担,待固化后可以给新同学或相对较新的同学实现。
  • 人员流动问题:做活动是比较重复的工作,在一般的团队,活动是给新人熟悉流程,熟悉业务的,而当做活动是常规工作,不做活动才是调节时,人才的选用育留是比较严峻的问题,留住一到两个核心人员,招聘合适的稳定的人,发展新的业务促进人员的成长。然而,人的问题往往是最根本的问题,也是最难解决的问题。人员的流动会成为一个一种常态,业务特性决定的,能减缓。
  • 新人问题:新人进来,总会踩到各种各样的坑,不管是产品还是开发,如何规避?新人手册?新人FAQ?导师审核?通过流程?不管是哪种方式,最后成长并适应下来的都是需要经过时间的洗礼。
  • 人员的分工:业务的模块化,从而引发人对这些模块的分工,人与模块对应上。比如接入新游戏,专人负责接入过程,负责接入后的文档撰写

需求管理

  • 同时以产品的维度和开发的维度组织;
  • 强跟进,变更的需求及时汇总;
  • 关注需求中提到的资源,如重构,资源单,号码包等,这往往是风险所在;

流程

  • 发布流程(活动发布过程检测,人工确认最终结果) 免测发布,版本发布,应用场景,开发自测,产品体验,外团体验
  • 后台CGI大变更灰度发布,前端大变更以大版本发布
  • 如何固化流程,如何确保上线的活动的正常可用,现在还在依赖于人工的检查和验证

以上是一年积累,有所感,有所想,无太多逻辑,且行且珍惜,只愿岁月静好。

产品驱动技术,改变的是kpi,
技术驱动产品,改变的是世界
这只是一个开发的遐想而已。
现实让我们知道疼!

PHP的压缩函数实现:gzencode、gzdeflate和gzcompress

  • gzencode 默认使用ZLIB_ENCODING_GZIP编码,使用gzip压缩格式,实际上是使用defalte 算法压缩数据,然后加上文件头和adler32校验
  • gzdeflate 默认使用ZLIB_ENCODING_RAW编码方式,使用deflate数据压缩算法,实际上是先用 LZ77 压缩,然后用霍夫曼编码压缩
  • gzcompress ;默认使用ZLIB_ENCODING_DEFLATE编码,使用zlib压缩格式,实际上是用 deflate 压缩数据,然后加上 zlib 头和 CRC 校验
  • 这三个函数的比较实质上是三种压缩方法:deflate, zlib, gzip的比较。
    从性能的维度看:deflate 好于 gzip 好于 zlib
    从文本文件默认压缩率压缩后体积的维度看:deflate 好于 zlib 好于 gzip

    这三种算法中gzip 、zlib的作者都是Jean-Loup Gailly和 Mark Adler。
    这两种算法以及图形格式png,使用的压缩算法却都是deflate算法。
    deflate算法是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。
    它最初是由Phil Katz为他的PKZIP归档工具第二版所定义的,后来定义在 RFC 1951规范中。

    deflate算法的压缩与解压的实现过程可以在压缩库zlib上找到。
    PHP的压缩实现依赖于zlib,zlib是一个提供了 deflate, zlib, gzip 压缩方法的函数库。
    我们所使用的上面三个函数,将参数中的encoding转为相同,压缩率设置相同,则其最终调用的是同一个函数,效果和性能一样。

    PHP的zlib实现是以扩展的方式存在于ext/zlib目录中。通过deflateInit2() + deflate() + deflateEnd()三个函数配合完成压缩功能,inflateInit2() + inflate() + inflateEnd()三个函数配合完成解压功能。压缩最终都是通过php_zlib_encode函数实现调用,除了输入的字符串,压缩率,结果的输出外,不同的入口函数调用参数不同的是其encoding。deflateInit2的第四个参数指定encoding,PHP定义了三个常量:

     #define PHP_ZLIB_ENCODING_RAW          -0xf      //deflate -15
    #define PHP_ZLIB_ENCODING_GZIP          0x1f      //gzip 15 + 16
    #define PHP_ZLIB_ENCODING_DEFLATE     0x0f      // zlib 15

    三个函数在调用过程可以直接指定encoding使用其它的算法:

    zlib:   ZLIB_ENCODING_DEFLATE 
    gzip: ZLIB_ENCODING_GZIP
    deflate: ZLIB_ENCODING_RAW

    此三个函数是三种算法的简单调用方式,以更好的命名展现。三个函数间可以通过指定相同的encoding达到相同的效果,并且PHP也提供zlib_encode函数作为通用的压缩函数。

    参考资料:

    http://www.gzip.org/zlib/rfc-deflate.html