Workflow Engine诞生的背景

 这几年有幸主导QQ看点内容处理系统的架构设计与开发,见证了系统从0到1的演进过程,先来一张整体概图,让读者了解内容处理系统所处位置。

 内容处理主要包括过滤、打标和内容本身的处理三部分,如下图所示:

 QQ看点初创阶段,每天的文章量非常少,图文5万篇/天,视频0.5万篇/天,内容中心的处理模块也只有10个左右。随着QQ看点业务的发展,目前每天的文章量已达千万,内容中心的处理模块也达到了150+。模块少的时候,怎么做效率也不至于太差,随着模块不断增多,就存在一个效率提升问题。这个不仅仅指文章的处理效率,还包括功能迭代开发、产品策略调整、系统故障定位等方面的效率。

 提几个问题,这几个问题都有一定的共性:

  • 往内容处理系统新增一个工程模块,怎么做比较快速?
  • 抖音视频内容处理中心(全球每天共产生100亿的小视频),如何快速的调整针对某个国家或地区的内容处理策略,以便能符合当地的监管要求??
  • 华为无线oss系统管理着自己多个制式的网络通信设备(包括基站、控制器等)、并可以对其进行远端软件升级。不同制式的设备,升级前准备工作、步骤、命令、参数、通信协议差异巨大,这个系统如何设计才能应付灵活的扩展?

 可以说,对于稍微复杂一些的处理系统,包括互联网产品、电信产品,都需要一个Workflow Engine(为行文方便,以下简称WE)来提高系统整体的可靠性、扩展性。QQ看点从成立之初,采用简单的DAG(Directed Acyclic Graph)模式来实现内容处理,随着业务不断发展壮大,逐渐过渡到了WE处理模式。

WE应该具备的功能

  • 从字面意思解读,WE负责工作流程的编排,对整个工作流负责,不能因为某个子系统出现问题而导致整个工作流受阻。流的速度既不能过高也不能过低,过高则压垮处理子系统,过低则影响处理效率。
  • 能够组装出多种工作流,以便满足产品、运营的各种策略,并能快速调整。
  • 抽象出通用的非业务逻辑,减少新子系统开发量,快速迭代上线。

QQ看点内容处理系统的演进

1、整体时间节点

2、DAG实现方式及优缺点

  • 通过HBase的状态位字段,所有模块形成一个有向无环图(DAG),并依据产品策略做不同处理逻辑。待本模块的所有前置模块都处理完毕后,才开始能执行当前模块。
  • 模块之间无直接通信,只和存储HBase打交道。
  • 优点:实现简单,能够快速完成产品功能的迭代上线。
  • 缺点:处理效率低,对存储HBase依赖大,产品策略调整不灵活,无完整的监控调用链,故障定位麻烦。

3、针对DAG优化的备选方案

  • 通过Kafka的Topic订阅、发布,所有模块形成一个有向无环图,并依据产品策略做不同处理逻辑。本模块订阅所有依赖模块的Topic,待所有Topic都收到后再开始处理,处理完毕后发布本模块的Topic。
  • 模块之间无直接通信,只和消息中间件Kafka打交道。
  • 优点:改进了依赖存储HBase处理效率低的问题。
  • 缺点:当模块之间的依赖关系变得复杂后,Topic的管理会非常麻烦,仍然存在产品策略调整不灵活、无完整监控调用链、故障定位麻烦的问题。当一个模块依赖2个以上(含)的Topic,实现层面的挑战也非常大。

4、WE方案介

  • WE有三部分组成,Spout、Dispatch、管理Portal,Spout负责源源不断的提供待处理文章;Dispatch负责和具体业务模块打交道;管理Portal用于配置和调整工作流。通过L5来实现服务的注册、发现、容灾与备份。
  • Spout多台机器之间通过Zookeeper和一致性Hash,构成容灾和备份系统。
  • Dispatch多机之间通过分布式锁互斥处理文章,并通过Portal管理系统配置的工作流来和具体业务模块打交道。为方便处理结果回溯,工作流执行情况上报到TDW保存。
  • 优化效果:文章处理耗时从以前的30分钟缩短到3分钟之内,大大提高了文章处理效率,模块接入也方便很多。

5、工作流中间状态的考量

 工作流中间状态信息由谁负责落地到存储(HBase),当时业务方提出希望由自己负责,好处是业务模块获得了灵活性。从技术上讲,这没有任何问题的,不过这个方案束缚了WE的可扩展性,也不利于后面“智能调度”、“中台”的建设与推进,最终决定由WE负责工作流中间状态的传递、合并、落地。

6、智能调度系统的建设

 工作流中间状态由WE负责,这个方案有助于智能调度的实现。具体业务模块和WE商定好输入参数、输出参数、模块依赖关系后,可以纳入对应工作流。WE准实时拉取产品、运营人员设定的策略信息(比如,文章优先级策略、为世界杯文章跳过某些处理模块等),并对新进文章或者视频生效。这里需要强调的是,不管多“智能”,总归都是预先设定好的,需要业务模块的支持,必要的时候配以相关的默认值。

7、往中台方向推进

 “中台”可以节省人力、机器资源成本,加快产品功能迭代上线,并在某一领域可以做到极致。以内容分词为例,在实现的时候,需要为多语言留下配置入口,这样国际化的步伐就会很快,成本也极低,若每个App单独搞,进度和成本可想而知。

WE与业务模块的业务协议

 WE和业务模块采用Tcp协议,包头+ProtoBuffer,ProtoBuffer的定义如下,采用同步等待的方式,WE发请求给业务模块,业务模块处理完毕后将处理结果在回包里面给到WE。

message FieldInfo
{optional bytes bytes_key = 1;//hbase中的字段名optional bytes bytes_value = 2;
};message ReqBody
{optional bytes bytes_rowkey = 1;repeated FieldInfo rpt_msg_field_info = 2;// 模块输入参数字段//  下面字段主要用于:调度模块将当前请求的超时时间传递给具体业务模块,业务模块根据// 这个信息可以做一些优先级处理。如果从接收到请求到过了uint64_time_out还没有回包,// 调度模块则认为超时。optional uint64 uint64_time_out = 3;//当前请求的超时时间,例如10000毫秒,精确到毫秒,
};enum RetEnum
{SUCC = 0x00;//处理成功,指某个步骤成功处理完成,和文章本身是否合法、能否推送给看点没有关系。FAIL_PARSE_REQ_PKG = 0X40;// 解析请求包失败(调用方也不可能收到这样的错误,纯属定义全集场景)REQ_PKG_PARAM_INVALID = 0X41;// 请求参数非法,终止本篇文章的处理+告警上报+记录此文章rowkeyREQ_MUST_PARAM_MISS = 0X42;// 必选或者前置参数缺失,终止本篇文章的处理+告警上报+记录此文章rowkeySVR_INNER_ERR = 0x43;//服务内部错误,流式中心重试N次后:终止本篇文章的处理+告警上报+记录此文章rowkeyFAIL_BACK_SVR = 0X44;//后端服务错误,流式中心重试N次后:终止本篇文章的处理+告警上报+记录此文章rowkeyFAIL_PACK_RSP_PKG = 0X45;//回包组装失败(调用方也不可能收到这样的错误,纯属定义全集场景)SVR_OVER_LOAD = 0X81;//本服务过载,流式中心重新分配业务的机器,如果都是服务过载则当前文章sleep一段时间+报警。NO_AUTH = 0X90;//没有权限OVER_LIMITS = 0X91;//调用超频FAIL_BACK_TIMEOUT = 0X92;//后端模块超时FATAL_ERROR = 0X93;//后端模块致命错误
};message RspBody
{optional RetEnum enum_ret = 1;optional bytes bytes_msg = 2;optional bytes bytes_rowkey = 3;repeated FieldInfo rpt_msg_field_info = 4;//模块输出参数字段
};   

 Tcp同步等待的方式,简化了业务模块的开发模式:接受输入参数->处理->返回结果。

 以每天1000万篇文章计算,QPS峰值在350/s左右(假设峰值为均值的3倍,下同)。若后面文章量变成100亿,QPS峰值将达到35万/s,Dispatch和业务模块可以横向扩展,架构无需变动。Spout模块,因扫描的是全量未处理文章,需要在前面做一次业务分片,然后在分片里面通过一致性Hash来实现容灾和备份处理。

总结

 WE成为内容处理系统的大脑,使得各个业务模块可以高效有序的运作,让业务模块成为一个“来料加工”的原子化、无状态的服务,方便业务迁移和水平扩展。WE抽象出通用的非业务逻辑,例如,失败重试、存储的读写、防雪崩、业务降级等,最大限度简化业务模块的开发。WE针对不同的场景,实现一套代码、多份配置策略,从状态“Trigger”,经过“智能调度”,最终演进到内容处理“中台”。

文章首发于微信公众号【jameswhale的技术人生】,因精力有限,会不定期将文章同步到CSDN平台。

如何为信息流内容中心设计一个高效的处理链路,详解QQ看点在这方面的演进过程相关推荐

  1. failed to open log file_C++中glog源码剖析以及如何设计一个高效 log模块

    每个开发者编程中都会记录log信息,多数人都会使用log第三方库,log库使用起来很方便,但我们也需要了解log系统的原理,这里以glog为例进行分析. 开始 这里不会介绍glog中是如何控制INFO ...

  2. 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符

    题目描述 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符. 给定一个字符串(不一定全为字母)A及它的长度n.请返回第一个重复出现的字符.保证字符串中有重复字符,字符串的长度小于等于500 ...

  3. 【C++】公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?请设计一个“高效”的算法求解。

    题目分析 公元前五世纪,我国古代数学家张丘建在<算经>一书中提出了"百鸡问题":鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一.百钱买百鸡,问鸡翁.鸡母.鸡雏各几何?请设计一 ...

  4. 网页设计中的默认字体样式详解

    浏览器默认的样式往往在不同的浏览器.不同的语言版本甚至不同的系统版本都有不同的设置,这就导致如 果直接利用默认样式的页面在各个浏览器下显示非常不一致,于是就有了类似YUI的reset之类用来尽量重写浏 ...

  5. Java IDEA Debug模式下断点回退(一键回退到上一个断点前方)操作方法详解

    @Java IDEA Debug模式下断点回退(一键回退到上一个断点前方)操作方法详解 1.请求进入第一个断点: 2.请求进入第二个断点: 3.回退断点(回到上一个断点之前,图1,图2共两种操作方法) ...

  6. 设计一个简单分页存储管理系统_【系统架构】如何设计一个简单灵活的收银系统?看这里!(1)...

    在电商项目中,收银系统是一个不可或缺的功能,因为你不仅要通过它来进行收款.退款,而且也要通过它进行财务的对账.报税等.因此,如何设计一个简单灵活的收银系统,对于开发电商项目来说非常重要. 那如何设计一 ...

  7. 支付退款流程设计_【系统架构】如何设计一个简单灵活的收银系统?看这里!(1)...

    在电商项目中,收银系统是一个不可或缺的功能,因为你不仅要通过它来进行收款.退款,而且也要通过它进行财务的对账.报税等.因此,如何设计一个简单灵活的收银系统,对于开发电商项目来说非常重要. 那如何设计一 ...

  8. kafka 同步提交 异步_详解Kafka设计架构核心——Kafka副本机制详解

    所谓的副本机制(Replication),也可以称之为备份机制,通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝.副本机制有什么好处呢? 1. 提供数据冗余.即使系统部分组件失效,系统依然 ...

  9. cpld xilinx 定义全局时钟_FPGA/CPLD设计工具:Xilinx ISE使用详解

    第1章  ISE系统简介  1 1.1  FPGA/CPLD简介  1 1.1.1  FPGA/CPLD的基本原理  2 1.1.2  FPGA和CPLD的特点  7 1.2  FPGA/CPLD的设 ...

最新文章

  1. linux 挂载光盘映像,在 Windows Mac和Linux上,如何挂载iso和其他光盘映像
  2. 收到邮件乱码html,为什么我发的html格式邮件收到的是乱码呢?(100分)
  3. python Day6 面向对象学习
  4. 防止html标签转义
  5. Java静态方法可能会产生代码异味
  6. autosar网络管理_AP AUTOSAR平台设计(11)——网络管理
  7. java基础将字符串进行反转
  8. 《日志管理与分析权威指南》一1.6 人、过程和技术
  9. 【c语言】 gets()函数不执行/被跳过
  10. BCH的51攻击与防守
  11. 克里金方法内插生成高程曲面
  12. 1月16日云栖精选夜读 | 阿里P8架构师谈:Zookeeper的原理和架构设计,以及应用场景...
  13. 指法练习软件需求说明书
  14. 自制的MATLAB拼图游戏GUI界面版详解(下篇)
  15. 分布式架构之CAP理论/AP架构/CP架构
  16. 采用16线激光雷达调用cartographer室内定位
  17. [软件工具][原创]加减乘除自动出题带答案不重复生成可代替加减法印章使用教程
  18. 数学建模学习笔记(第三章:量纲分析法,量纲齐次原则)
  19. 开发工具|API统计 API诊断来啦
  20. 书信:欲寄彩笺兼尺素,山长水阔知何处

热门文章

  1. flutter PageView 禁止左右滚动
  2. mysql数据库开启ssl_MySQL 5.7.x开启SSL连接
  3. 【语义分割系列】deeplabv3相关知识点以及pytorch实现(ASSP模块)
  4. 数字签名技术以及RSA算法的原理实现
  5. 【经典】“看不见“、“看不起“、“看不懂”、“来不及”。
  6. pppd 中文man页面
  7. java 解析MP4文件
  8. Elasticsearch使用DateHistogram聚合
  9. debian 11.3 国内最快镜像源
  10. 天涯论坛最新100句流行语