全面提升-SLS移动端SDK2.0发布

本文涉及的产品
对象存储 OSS,20GB 3个月
文件存储 NAS,50GB 3个月
云备份 Cloud Backup,100GB 3个月
简介: 未来5G时代,移动端应用将会产生巨大的飞跃,借助于SLS在服务端、嵌入式端等积累的数据采集经验,我们充分吸取各个端上的优势开发了移动端SDK2.0版本,在支持众多高级功能的情况下依然能够保持高性能与低资源占用,能够满足移动端的各类数据采集需求。

背景

随着移动互联网的高速发展,智能手机得到了快速的普及,《2020全球移动市场报告》中预测,2023年,全球智能手机用户或将突破40亿,而中国用户将占到其中的1/4,其中5G智能手机数量占比将达到43%。这也就意味着未来中国几乎人手一个智能机,每个人的生活都和智能机上的APP相关。并且随着5G技术的普及,流量红利即将全面打开,APP的多媒体丰富性将达到一个新的层次。

这些发展的背后,也将带来很多挑战,其中之一就是如何保证逐渐复杂的APP如何被更好的收集和分析。目前数据分析的能力相对都比较成熟,但收集几乎都需要每个公司自己开发,其中可能会涉及到各种各样的问题,例如:

  • 应用已有的工具是否可以支持采集海量的数据。
  • 日志上报不及时,无法实时监控可能出现的问题。
  • 出现问题,依靠零散的日志,定位问题的成本增加。
  • 想对于某些型号或版本的统计分析耗时耗力,很难构建用户画像。
  • 日志上报需要占用APP额外的CPU、内存、网络等资源,低劣的方案可能会对应用性能产生影响。

SLS 数据采集系列

image.png

日志服务(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统一平台

image.png

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的负载。

image.png

全球加速

针对以上问题,日志服务联合阿里云CDN推出了一款全球数据上传自动加速方案:“基于阿里云CDN硬件资源,全球数据就近接入边缘节点,通过内部高速通道路由至LogHub,大大降低网络延迟和抖动 ”。 该方案有如下特点:

  • 全网边缘节点覆盖:全球1000+节点,国内700+节点,分布60多个国家和地区,覆盖六大洲
  • 智能路由技术:实时探测网络质量,自动根据运营商、网络等状况选择最近接入
  • 传输协议优化:CDN节点之间走私有协议、高效安全
  • 使用便捷:只需1分钟即可开通加速服务,只需切换到专属加速域名即可获得加速效果

image.png

在我们的日志上传基准测试中,全球7个区域对比整体延时下降50%,在中东,欧洲、澳洲和新加坡等效果明显。除了平均延时下降外,整体稳定性也有较大提升(参见最下图,几乎没有任何抖动,而且超时请求基本为0)。确保无论在全球的何时何地,只要访问这个加速域名,就能够高效、便捷将数据采集到期望Region内。
关于全球采集加速的更多内容,可参考我们的文章:数据采集新形态-全球加速

性能测试

下面是1.0和2.0版本的性能测试结果,可以看到由于采集的是和IoT SDK一致的C语言内核,Android IOS SDK在资源控制上会更加的高效,性能也更高。

image.png

测试环境如下:

  • 每个缓存的日志包的大小上限,为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。

image.png

相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
目录
相关文章
|
2月前
|
开发工具 Python
【SLS开源兼容系列】使用ES SDK 访问SLS
本文介绍如何用es sdk访问sls
120 0
|
2月前
|
数据可视化 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用相机日志跟踪功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用相机日志跟踪功能(C++)
45 0
|
12月前
|
缓存 监控 JavaScript
日志服务(SLS) 的桌面端 Node.js SDK 封装
日志服务(SLS) 的桌面端 Node.js SDK 封装
16107 7
|
12月前
|
Java 测试技术 API
工银e生活开发脱坑日志(9)JAVA版的SDK自动生成msgId,PHP如何生成消息通讯唯一编号msgId
工银e生活开发脱坑日志(9)JAVA版的SDK自动生成msgId,PHP如何生成消息通讯唯一编号msgId
120 0
|
开发工具 Android开发 开发者
Appium 移动端自动化 - Android SDK连接安卓手机,adb连接一加8手机USB调试实例演示,连接一加8手机不显示USB调试选项问题排查
Appium 移动端自动化 - Android SDK连接安卓手机,adb连接一加8手机USB调试实例演示,连接一加8手机不显示USB调试选项问题排查
435 0
|
开发工具 Android开发
Appium 移动端自动化 - Android SDK的安装与配置,使用安卓SDK连接手机实例演示
Appium 移动端自动化 - Android SDK的安装与配置,使用安卓SDK连接手机实例演示
150 0
|
数据采集 存储 机器学习/深度学习
SLS:基于 OTel 的移动端全链路 Trace 建设思考和实践
SLS:基于 OTel 的移动端全链路 Trace 建设思考和实践
341 0
SLS:基于 OTel 的移动端全链路 Trace 建设思考和实践
|
数据采集 存储 机器学习/深度学习
SLS:基于OTel的移动端全链路Trace建设思考和实践
从移动端的视角来看,一个App产品从概念产生,到最终的成熟稳定,产品研发过程中涉及到的研发人员、工程中的代码行数、工程架构规模、产品发布频率、线上业务问题修复时间等等都会发生比较大的变化。这些变化,给我们在排查问题方面带来不小的困难和挑战,业务问题会往往难以复现和排查定位。比如,在产品初期的时候,工程规模往往比较小,业务流程也比较简单,线上问题往往能很快定位。而等到工程规模比较大的时候,业务流程往往涉及到的模块会比较多,这个时候有些线上问题就会比较难以复现和定位排查。
381 0
SLS:基于OTel的移动端全链路Trace建设思考和实践
|
Java 开发工具 Maven
java调用阿里云日志SDK 查询日志
java调用阿里云日志SDK 查询日志
634 1
|
存储 监控 Cloud Native
使用SDK管理SLS告警-以Go为例
除了在SLS控制台创建告警监控以外,SLS的SDK也提供了对告警的管理功能,其中主要包括了初始化告警资源,告警监控规则的增删改查,告警资源的增删改查等功能。
1636 0

相关产品

  • 日志服务