前面说了那麽多理论,最後几天来写一下开发实务吧!今天要介绍的是怎麽收集 App 使用者行为资料。
追踪事件是需要成本的,这些成本包括开发、蒐集、除错、分析等。因此一开始思考的点是「哪些事件对於商业来说是最重要的」。
由於当时的 App 的商业模式是以广告为主,最重要的就是说服我们的 App 能帮广告主带来流量,因此最重要的资料应用就是每日活跃使用者数报表,用这个报表向广告主说明每天会有多少人看过他们的广告,并以此来收费。从一开始就很明确要追踪的资料以及应用上的目的。
最一开始的设计当然是以简单为主,幸好市面上有很多工具可以协助我们做到这件事。其中最有名也最普遍的就是 GA 了(Google Analytics)只要在网站或是 App 里埋上对应的追踪码,GA 就能蒐集很多使用者的行为资料。如果要纪录比较复杂的行为,可以使用自定义的事件,在应对的使用者行为发生时送给 GA。
GA 的开发真滴简单,只要在网站里埋对应的追踪码就可以了。
同上,埋好之後就可以在 GA 的後台确认有没有部署成功,成功的话就能看到流量进来了。
虽然大家对於 GA 的数字还是有争议,但毕竟是 Google 的产品,所以也算是一般业界很常用来参考的数值。初期需要评估的大概就是两个点:
小的迭代像是增加追踪事件,或是调整 GA 报表之类。
用 GA 就是如此的方便,但之後就越来越难了。当满足基本商务需求後,接着就会有更复杂的商务需求,像是:「想知道不同年龄、性别的使用者会看什麽影片来更了解使用者以及找到合适的广告主」、「想知道哪部片最受欢迎来做排名推荐」、「想知道使用者留存率来优化使用者体验」等等。因为 GA 仅提供统计资料、没有办法知道特定的使用者行为,当 GA 无法满足这些需求时,就只好开始刻自己的事件追踪器了。
为了追踪个别使用者行为,在自制事件追踪便纳入了使用者辨识码。以 App 来说,对於登入的使用者就会用登入帐号(Email 或个人 ID 之类),对於未登入的使用者之前可以用 Device ID 来做使用者识别。
第一个自制的事件追踪,我们先用了一个很简单的 JSON 来定义与传送资料。
{
"device_id": "u123141",
"email": "[email protected]",
"user_id": "u123123",
"timestamp": "2021-09-29 00:00:00",
"event": "login",
"content1": "email",
"content2": "",
"content3": "",
"content4": ""
}
除了资料定义之外,也要考虑到後续怎麽收集。
我们初步选择 AWS Kineis 来做资料的收集以及 Lambda 来做後续的处理,并将处理完的资料放到 S3
App -> Kinesis -> Firehose -> SQS-> Lambda -> S3
在选择资料收集方法上的时候,要考量到价钱、可扩张性、易维护性以及稳定性。真的是幸好现在有 AWS 这样的云端服务才让这件事情变得容易许多(但 Kinesis 上次也是死了...)。
由於这次是自制事件追踪,在设计上就牵扯到很多单位。
前端
前端需要实作追踪事件,在特定的行为发生後将事件传送出来。
後端
由於刚开始没有人力开发後端,所以就采用上述的方式,将资料直接从前端抛到 Kinesis 上。
Data
Data Team 初期会负责检核资料以及做资料的前处理。
由於自己开发的元件和牵扯到的团队变多,部署时也开始复杂起来。前端、後端、Data 都有各自的部署周期,在团队间沟通上特别需要沟通好,以免就是前端上线、但是後端还没准备好的情况。这种时候上线建议先从 Data 开始上线,确保处理资料程序上线後,前端再让资料上线,以避免宝贵资料丢失的状况。
评估的时候除了前面提到的商务需求外,也需要评估自己开发的部分有没有问题,包括系统稳定度、负载量等等。因为 GA 的程序还没拔掉,所以也可以交叉比对一下自己收下来的资料与 GA 的差异(通常都会有差异)是否稳定。
上线之後除了修 bug 之外,当然也会依照实际需求来调整追踪的事件,前後端和资料团队都需要频繁的沟通和调整。
随着 App 逐渐复杂,使用者事件也会开始变得复杂。这时候原本的事件系统也变得越来越难维护,所以我们又痛定思痛做了一次大改版 QQ...
由於每个事件都有对应的资料要传,所以这次乾脆就独立一个栏位将事件内容放在里面方便整理。
{
"device_id": "u123141",
"user_id": "u123123",
"timestamp": "2021-09-29 00:00:00",
"event": "login",
"data": {
"method": "email",
"email": "[email protected]"
}
}
{
"device_id": "u123141",
"user_id": "u123123",
"timestamp": "2021-09-29 00:00:00",
"event": "itemview",
"data": {
"item_type": "recommendation"
"item_id": [1, 2, 3, 4],
"item_url": ["www.qq.com/1", "www.qq.com/2", "www.qq.com/3", "www.qq.com/4"]
}
}
这样设计的用意是想让纪录事件的内容文件看起来清楚一点,但事实证明当事件一多之後还是很恐怖...抱歉了我的前同事们...
在新事件上,我们因为一些原因屏除了直接打到 Kinesis 的方法,改用 RESTFul API 来接事件,这样以可以让後端做初步的资料格式检查。但沟通上就更复杂,需要前端+後端+资料三个团队一起涉入开发,开发复杂度也直接上天。当初最难的做的应该是实作自己的 session(https://support.google.com/analytics/answer/6086069?hl=zh-Hant&ref_topic=6083659) 机制吧...抱歉了我的前同事,但是我们真的需要这个酷东西。
整体开发来说,事件定义是最难的。除了 Session 以外,当初还想知道使用者实际上有看到哪些版位,IOS、Android、Web 对相同定义的实作方式都完全不同。
除了复杂度增加外,跟之前的差不多就跳过。
当事件越来越多,有几件事变得特别复杂
每个都有一段血泪史这边我就先不挖了。
好的事件是分析的第一步,千万不能觉得这些事件都是前端的事情,实作上前端真的有很多问题需要一起克服解决,才能维持事件的品质。
>>: Day 16 CSS <网页布局-定位布局-2.定位使用>
可曾想过,我所住的社区有什麽? 什麽是社区 在本文章的定义引自 wiki_社区 提到的,因为共享共同...
小游戏,威利在哪里? (威利穿着红白条纹的衬衫并戴着一个绒球帽,手上拿着木制的手杖,还戴着一副眼镜...
今日目标 : 不罗嗦,直接附上Code css .login{0 background-color:...
昨天我们安装了 Next 这个布景主题,今天就要来介绍如何编辑设定 Next,以及 Next 提供了...
在本篇, 我们来看一下使用seldon完成部署之後, 在k8s上会产生哪些资源 建立在k8s上的se...