一、背景
二、问题及解决思路
2.1 测试问题
2.2 解决思路
三、易测性设计
3.1 发送测试工具
3.2 API同步/异步双执行方式支持
3.3 可达性诊断工具
3.4 全链路唯一ID+埋点日志跟踪
四、结语
一、背景
转转推送系统(后面简称系统)在早期设计中主要考虑了三个核心指标:
-
吞吐量:指系统在单位时间内能够发送多少消息的能力。 -
扩展性:指系统在快速支持更多APP主体、发送策略、发送通道、通道策略等能力上的难易程度。 -
性能:指系统API的接口耗时。
为了同时满足三个核心指标,我们在系统中大量采用了异步、并发、批量等设计。这些设计虽然很好满足了系统设计指标,但是同时也给系统带来了较高的复杂度,再加之一些环境因素(如测试环境的不稳定),导致业务方(指系统使用方)在接入测试中经常需要系统人员协助定位问题,这种状况既降低了业务方的开发效率又增加了系统的维护成本。
为了解决业务方的接入测试问题,在之后的系统演进中我们又增加了第四个指标:易测性,希望通过这个指标来提高系统的可测试性和降低系统测试成本。本文将重点讲述我们在系统易测性指标上的一些设计经验供大家参考。
二、问题及解决思路
2.1 测试问题
业务方在接入系统时的测试问题主要体现在以下几个方面:
-
缺少测试发送工具; -
API接口是异步的,调用方拿不到结果信息,尤其是失败信息; -
测试环境不稳定且推送流程节点较多,不易快速定位问题点; -
线上数据量大,问题定位成本高。
对于这些问题,业务方的诉求是希望可以在测试阶段(包含自测、联调、QA测试)能够方便区分是API使用上的问题、环境问题还是系统规则限制导致的问题,在确定问题类型后又希望能够快速定位具体的问题原因。
2.2 解决思路
系统在增加“易测试”指标时不能影响到“吞吐量、扩展性、性能”三个核心指标,在此基础上我们需要给出更有针对性的解决方案。通过分析上面的问题可以总结出一些信息:
-
影响业务方效率的问题主要发生在测试阶段; -
业务方对测试阶段使用的测试环境API性能要求较低; -
上线后的问题都与规则限制类逻辑有关; -
业务方需要获取系统内部执行数据来辅助判断问题。
根据这些信息我们可以获得一些思路:
-
测试阶段是我们要解决的主要问题场景; -
业务方对测试环境服务对性能不敏感,可以通过同步方式返回结果信息; -
业务方对线上环境服务对性能敏感,整体还是需要异步方式保证性能,但是可以对耗时很低的基本参数验证部分使用同步方式,耗时较高的规则检验等逻辑部分依然保持异步方式; -
增加特定的内部数据查询API并能够自动化分析和定位问题; -
所有关键节点增加必要日志并通过唯一ID形成日志链,便于定位问题发生过程。
基于以上思路,我们实现了一些易测性设计,这些设计目前已经能够很好满足业务方的使用需求,业务方通过使用这些设计可以做到自助解决问题。业务方对这些易测性设计表示了高度的认可。
三、易测性设计
3.1 发送测试工具
发送测试工具是系统最基本的测试设计,它是对API的直接可视化封装,用户通过操作界面可以很方便的发送测试消息,然后在APP上预览效果。
3.2 API同步/异步双执行方式支持
在API的执行方式实现上,我们采用了“同步基本参数验证+同步/异步逻辑处理”的方式。主要考虑到了几点原因:
-
基本参数验证耗时非常少,使用同步方式也造成的性能影响非常小,还可以让调用方在所有环境及时感知和方便处理参数问题; -
逻辑处理部分按照“测试环境同步+线上环境异步”的按环境的方式配置,这样既保证了测试环境的易测性,又保证了线上环境的性能。
在“同步/异步逻辑处理”部分的设计上,我们还曾想过使用接口参数方式来控制,但是考虑到可能存在业务方在线上误用同步方式造成性能问题的情况而最终弃用。
对于API返回结果结构中我们还额外增加了一些诊断信息,不仅返回最终的结果信息,还会返回具体的执行机器IP和流程节点名称,方便系统人员快速定位问题位置。
3.3 可达性诊断工具
可达性诊断工具可以帮助用户快速判断出发送是否存在环境上或规则上的问题。用户通过输入用户UID或用户Token(APP生成的设备标识)和PushCode(消息类型和场景编号标识),然后选择对应的系统环境可查询出相关的数据信息,如:APP上报的通道信息、发送时选择的通道信息、当前设备受到的各类规则限制等等,诊断工具最终还会给出是否可发送的结论。
3.4 全链路唯一ID+埋点日志跟踪
在消息发送的源头为每一条消息生成一个唯一ID,并将此ID贯穿到所有流程节点的日志信息中,对于关键节点还要输出埋点日志(用于满足后续的数据分析需求),以此方便在庞大的消息量中定位指定消息的日志链,帮助快速定位问题原因。
四、结语
以上就是我们对转转推送系统在易测性方面进行的一些设计,不全是通用的解决方案,更多是Case By Case的特定化分析处理,但是这样的设计却更能够精准解决问题,获得最大收益。同时还启发我们,在进行复杂系统设计时,应当在早期就开始考虑易测性方面的设计,通过良好的易测性设计来降低长期测试成本和维护成本。
作者简介
谢立旗,转转C2C业务研发负责人,负责C2C业务及推送系统。

