背景
随着移动互联网的高速发展,智能手机得到了快速的普及,《2020全球移动市场报告》中预测,2023年,全球智能手机用户或将突破40亿,而中国用户将占到其中的1/4,其中5G智能手机数量占比将达到43%。这也就意味着未来中国几乎人手一个智能机,每个人的生活都和智能机上的APP相关。并且随着5G技术的普及,流量红利即将全面打开,APP的多媒体丰富性将达到一个新的层次。
这些发展的背后,也将带来很多挑战,其中之一就是如何保证逐渐复杂的APP如何被更好的收集和分析。目前数据分析的能力相对都比较成熟,但收集几乎都需要每个公司自己开发,其中可能会涉及到各种各样的问题,例如:
- 应用已有的工具是否可以支持采集海量的数据。
- 日志上报不及时,无法实时监控可能出现的问题。
- 出现问题,依靠零散的日志,定位问题的成本增加。
- 想对于某些型号或版本的统计分析耗时耗力,很难构建用户画像。
- 日志上报需要占用APP额外的CPU、内存、网络等资源,低劣的方案可能会对应用性能产生影响。
SLS 数据采集系列
日志服务(SLS)作为一个综合的数据采集、分析、可视化、监控平台,支持各种类型数据的统一接入,目前端上数据接入主要有:
- 客户端Logtail在X86/ARM服务器上有数百万的部署,服务阿里/蚂蚁经济体、各行业云上客户,每天采集数据10PB+
- 移动端SDK:Android/IOS平台数据采集,每天已有上亿的DAU
- Web Tracking(JS):类似百度统计,Google Analytics 轻量级采集方式,无需签名
- 嵌入式SDK:支持各类IoT设备数据采集,资源占用极少,支持各类嵌入式平台
从1.0到2.0
SLS移动端SDK(Android、IOS)1.0的发布已经有5-6年,目前已经积累了众多的用户,DAU已经上亿。然而随着智能机、4G的普及以及未来5G的发展,移动端SDK的1.0版本已经逐渐暴露出一些问题,例如:
- 同步数据发送:用户需要基于SDK再次封装异步发送逻辑,实现复杂度较高。
- 不支持日志上下文:没办法追踪某个设备数据发送的数据上下文信息,问题排查较为复杂。
- 资源占用问题:SDK基于很多三方库来实现,性能较低而且资源占用率很高。
- 离线缓存:只有Android SDK支持离线缓存,而且实现效率较低,开启后会影响应用性能。
借助于SLS在服务端、嵌入式端等积累的数据采集经验,我们充分吸取各个端上的优势开发了移动端SDK2.0版本,在支持众多高级功能的情况下依然能够保持高性能与低资源占用。
多端SDK统一平台
2.0架构下SLS的端上SDK基于共同的基座C Core SDK适配,C Core部分代码使用纯C语言编写,且对性能进行了极端的优化(包括缓存管理、文件管理、PB序列化等),能够适用于服务端、IOT、移动端等各种场景。同时C Core部分的代码提供了多种配置方式,可以通过配置决定是否打开某项功能。目前2.0版本的Android IOS SDK均基于C Core提供的统一接口适配实现,具备C Core SDK的各类高级功能,包括:
-
异步
- 异步写入,客户端线程无阻塞
-
聚合&压缩 上传
- 支持按超时时间、日志数、日志size聚合数据发送
- 支持lz4压缩
-
多实例
- 可同时创建多个实例分别发送到不同的目标,每个客户端可独立配置采集优先级、缓存上限、目的project/logstore、聚合参数等 (多客户端,断点续传文件路径不能相同)
-
缓存
- 支持缓存上限可设置
- 超过上限后日志写入失败
-
自定义标识
- 支持设置自定义tag、topic
-
断点续传功能
- 每次发送前会把日志保存到本地的binlog文件,只有发送成功才会删除,保证日志上传At Least Once
-
查看日志上下文
- 支持查看某条日志的上下文呢,可以更好的定位问题
断点续传
此次2.0版本的一个巨大提升是完美支持了断点续传功能,在移动端,应用的生命周期不可控,因此绝大部分情况下无法实现优雅退出,应用可能在任意时刻、任意阶段被强制终止,而这时如果产生的日志没有被发送出去则会丢失掉。针对这种场景,我们设计了一套保证At Least Once的断点续传机制:每次发送日志前会把数据强制刷盘,只有在发送成功后才会把盘上的数据文件清空。为了尽可能减少IO,我们在断点续传中使用了WAL+RingFile的磁盘管理方式,每次以Append形式写入,尽量减少随机Seek,CheckPoint和数据清理也是聚合执行,以进一步减少IO的负载。
全球加速
针对以上问题,日志服务联合阿里云CDN推出了一款全球数据上传自动加速方案:“基于阿里云CDN硬件资源,全球数据就近接入边缘节点,通过内部高速通道路由至LogHub,大大降低网络延迟和抖动 ”。 该方案有如下特点:
- 全网边缘节点覆盖:全球1000+节点,国内700+节点,分布60多个国家和地区,覆盖六大洲
- 智能路由技术:实时探测网络质量,自动根据运营商、网络等状况选择最近接入
- 传输协议优化:CDN节点之间走私有协议、高效安全
- 使用便捷:只需1分钟即可开通加速服务,只需切换到专属加速域名即可获得加速效果
在我们的日志上传基准测试中,全球7个区域对比整体延时下降50%,在中东,欧洲、澳洲和新加坡等效果明显。除了平均延时下降外,整体稳定性也有较大提升(参见最下图,几乎没有任何抖动,而且超时请求基本为0)。确保无论在全球的何时何地,只要访问这个加速域名,就能够高效、便捷将数据采集到期望Region内。
关于全球采集加速的更多内容,可参考我们的文章:数据采集新形态-全球加速 。
性能测试
下面是1.0和2.0版本的性能测试结果,可以看到由于采集的是和IoT SDK一致的C语言内核,Android IOS SDK在资源控制上会更加的高效,性能也更高。
测试环境如下:
- 每个缓存的日志包的大小上限,为1Mb
- 每个缓存的日志包中包含日志数量的最大值,为1024
- 被缓存日志的发送超时时间,为3秒
- 单个Producer Client实例可以使用的内存的上限,为64Mb
- 发送线程数为1
- 每条数据有10个键值对,约700字节
快速接入
Android SDK
详细接入方式: https://github.com/aliyun/aliyun-log-android-sdk
- Gradle配置
jcenter()
implementation 'com.aliyun.openservices:aliyun-log-android-sdk:2.3.0'
IOS SDK
详细接入方式: https://github.com/aliyun/aliyun-log-ios-sdk
- Podfile
pod 'AliyunLogProducer', '~> 2.1.0'
总结
移动端2.0 SDK使数据可以更便捷、更稳定、更高效地从移动端实时传输到SLS中,对于应用开发者来说使用SLS的2.0 SDK会更加简单,无需关心异步、队列、重试、可靠性等基础问题。解决了通道问题后,未来我们会更加聚焦于移动端埋点、移动端数据分析、移动端/服务端全链路监控等场景,为大家带来更加完备的解决方案。
大家在使用SLS过程中,如有任何问题, 可提工单, 或在用户群中反馈(见下放钉钉二维码), 也欢迎关注我们的微信公众号, 会推送实用的使用技巧和最佳实践哦~
ps: SLS团队长期招聘人才,欢迎对大数据、监控、可观察性、前端可视化、移动端开发、机器学习等有兴趣的同学前来联系我,邮箱 davidzhang.zc@alibaba-inc.com,微信 davidzhang-zc。