其他
一切数据皆可配置:爱奇艺海外站的运营后台设计实践
爱奇艺海外App是一个重运营的应用。对于App里的顶导航、我的页面、弹窗等,需要根据模式、版本、平台、语言、渠道等不同的维度进行运营管理。随着业务快速发展,版本快速迭代,如何保持运营资源能够被高效、稳定和灵活地配置,如何高效稳定的为新的运营需求提供支持,是我们需要解决的问题。
在这种背景下,爱奇艺海外Phone后端研发组通过打造一个稳定、灵活、高效的运营配置平台来解决前面遇到的问题。本文主要分享我们在建设高效的运营配置平台过程中积累的一些经验以及面临的挑战和思考。
1.配置资源拆解
运营资源范例:弹窗 | 基础数据:底部导航 |
1.1 运营资源
时效性强:只在一定时间范围内显示在C端固定位置。
模式强相关:每个活动、广告都只会出现在固定的某些模式。
数据变动频繁:特别是活动类数据,展示的图片文案等变动较为频繁。
支持多语言展示:基于爱奇艺海外站面向全球用户的情况,不同模式下需要展示不同的语言文案。
1.2 基础数据配置
多维度:需要针对不同的模式、语言做不同的配置。
长期有效:这种类型的配置一般长期存在,过期场景较少。
2.实践中的痛点:运营效率低、重复工作多
2. 研发周期长,运营效率低,从需求的提出到运营上线周期长。
3. 灵活性差,对不同的运营维度(模式、版本、时间等)都需要事先确定好,无法动态调整。
3.实践中的思考:明确三个原则
通过调研我们确认项目设计的原则主要有以下三个:
一切数据皆可配置 运营数据高可用 接口性能高效
通过不断的实践和总结,我们希望能从以下三个方面实现上述原则:
3.1 数据JSON化
3.2 运营数据多点存储
3.3 接口SDK化
4.IQ运营位架构
4.1 数据层
4.2 服务层
其中运营后台主要面向运营人员和产品,提供数据的配置后台。
开放平台收归于开发技术人员,提供一个增加运营位配置的后台。
数据服务主要是为调用数据的开发提供一个统一的、高可用的、高性能的api接口。
SDK为数据服务服务。主要目前是简化开发人员的接入成本,提供数据服务性能和可用性。
4.3 接入层
B端配置如何更便捷?在设计项目的时候后台配置秉持的原则有且只有一个:一切皆可配置。通过开放后台来配置IQ运营位,每个IQ运营位相当于一个业务形态,比如导航栏,而运营位内包含多个数据,比如title,link等,而title包含多种语言,需要配置多语言key。开放平台的作用就是创建IQ运营位,为IQ运营位配置字段。运营后台则用于配置开放平台创建的IQ运营位数据。
4.4 监控层
C端的接入即数据的获取在SDK内部实现,SDK内部我们做了以下功能:1. 如果请求包含某些特定离散字段如设备id,因为包含的数据量极大,存入本地缓存会给业务方的机器内存带来很大压力,则避开缓存直接请求服务。
2. 为了满足数据实时性要求较高的业务方,新增不接入本地缓存的逻辑。
3. 如果只包含某些聚合度高的字段如平台字段,版本,模式,语言等,则把请求的数据存入本地缓存。本地缓存通过监听运营平台的方式进行异步更新,当异步更新获取数据失败,则保持之前的数据返回,避免极端情况运营数据全部为空,将业务损失降至最低。
4. SDK内部通过异步线程,将本地缓存的使用情况通过定时线程存入,通过后台界面展示各缓存使用情况,对各类缓存的使用情况实时监控。
5.稳定性与性能保障
一切数据皆可配置 运营数据高可用 接口性能高效
下面我们介绍下运营后台稳定性与性能保障所作出的解决方案。
整体请求流程图如下:
5.1 稳定性保障
除了在操作机制上即运营流程化数据配置机制、多级数据存储使用分布式缓存以及分布式数据库以外,我们还提供了一个SDK方案来对服务的故障进行降级。下面我们将详细介绍该方案的落地过程。
2. 基于爱奇艺海外站业务的特点,国外网络环境不可预测,环境差等情况,尽可能的减少网络请求链路。
3. 一旦中心服务故障,周知各业务方不要重新部署,以本地缓存实现数据降级。
但是本地缓存的方案缺点也非常明显,即一旦有运营后台数据更新,各业务方无法实时获取到最新的数据。基于此,我们对SDK进行了以下几个版本迭代工作。具体见下图:
SDK内部技术的演进过程
2. MQ的方案该如何设计?
针对问题1,我们在SDK内部实现一套这样的机制,通过scheduledexecutorservice定时任务,周期性的将缓存使用情况拉取到库内,这样在通过后台界面就可以根据时间展示本地缓存的使用情况。这样,可以系统的掌握各个不同的业务方缓存的使用情况,供业务方的内存申请和分配提供数据支撑。
(2)运营位有多个,但对于业务方来说没有必要在没有接入的运营位更新数据时去异步地请求运营后台中心服务更新数据(因为这些数据这个业务方压根没接入)。
针对(1),明确的是消息的生产者是运营后台服务,而一个消息需要被所有业务方监听,具体的说是所有业务方的每台机器。所以,每台机器应该属于不同的消费组。所以我们需要找到一个每台机器都不一样的标识节点,以这个节点做为消费组。显然,这个节点最好的就是机器地址,可以保证每台机器所在分组都不一样。
针对(2),我们提供一个配置文件,各业务方需要在配置文件内写入各自业务方使用的IQ运营位名称,当一个消息来临时,首先需要判断这个消息中的运营位名称是否包含在配置文件内,如果不在,则这条消息被忽略(空消费),如果在,则请求响应的运营位更新本地数据。
5.2 性能保障
在运营位的实践配置中我们发现,运营数据的变化或者说运营人员更改运营数据的情形相比网络请求来说是非常低频的,比如之前分析的基础运营数据。因此,数据缓存在客户端可以避免客户端与后端服务的网络消耗,极大的提高性能。
我们的方案是为每个运营位数据提供一个版本的概念。通过保存各运营位的操作最新时间,在客户端开屏时发起一次请求,将所有的运营位最近的数据更新时间返回给客户端,客户端将该时间戳缓存在本地,当下次开屏请求时,同样会获取到服务端返回的运营位最近更新时间戳,将本地的与服务的进行匹配,来确认是否去更新各个运营位的数据,如果客户端缓存的运营数据时间与运营后台返回一致,则直接展示缓存在客户端的数据。
这种方案的另一个好处是可以在极端的情况下,如对外暴露的api出现故障,通过禁止运营后台的数据更新,可以使业务数据正常展示,避免出现运营数据消失的严重故障。
具体的请求流程图如下:
6.总结与展望
通过配置数据的Json化实现业务字段的可扩展性。通过设计的数据模型来介绍满足多语言情况下的各类运营配置数据方法。通过提供SDK内部实现本地缓存,MQ监听,异步更新的机制解决了服务中心化的大流量问题和缓存导致的数据不一致问题。针对海外的具体情况,提出了客户端缓存的相关方案。
IQ运营位从今年5月开始规划,历时近半年时间,由于中途穿插了很多的产品需求,所以在自身使用与用户反馈两个渠道进行问题收集,前后共经过了两个版本的迭代。目前在运营后台的界面与使用便利度上在持续优化。
IQ运营位上线2个多月以来在爱奇艺海外站得到广泛使用,在工程效率上更是有质的提高,拿最近的错误码配置来举例,错误码需要给客户端返回各类错误码以及对应的相关文案,文案是多语言场景的,通过IQ运营位配置化实现,只需要在分析需求,拆分业务字段和数据露出的条件后,5min以内就可以给出相应的运营后台。
当然,随着业务的迭代与场景更新,IQ运营位仍存在一些不完善的地方,在未来我们将会在工程实践中的持续迭代过程中做更进一步的工作,解决各类问题,更好的服务好IQ运营位的客户与广大爱奇艺海外用户。
正飞:IQ运营位项目负责人,IQ运营位的设计与开发者。
也许你还想看