DataTransHub 是基于mmap的客户端海量数据上报组件,其中包括两个组件DataTransHub和Flog DataTransHub主要用于数据的上报,Flog主要用于log的上报。 实现客户端海量数据的高性能上报,上报过程不会block任何操作,实现高性能上报,基于腾讯Xlog的数据压缩和加密算法,实现数据的高压缩比压缩和加密存储。全新设计上报调度模块,策略调度完全由内部控制。
- 跨平台,DataTransHub是跨平台实现,适用于Android和iOS,多端代码统一,逻辑统一,避免逻辑不一致性。
- 海量数据存储和上报,采用实时压缩和加密,实现海量数据高效上报服务端。
- 多实例实现,不同业务采用不同实例,不同上报接口,完全解决腾讯Xlog单实例的弊端。
- 不丢数据,采用mmap实现缓冲区。即使发生应用crash或者进程被杀,数据不会丢失,下次启动会再次上报。
- 低功耗,采用c++实现,整个上报共用一个线程,多实例多业务场景共用同一线程,当数据全部上报完成后,线程休眠。
- 上报策略合理封装,通过参数设置,可以实现完全自主策略设置,满足不同业务需求
- 合理设置缓冲区大小和上报文件大小,可以提高网络利用率,减少上报次数以及网络链接次数。
数据通过调用接口进入DataTransHub,先缓存到数据缓冲区,缓冲区实现是mmap,即使发生crash数据不丢失。当缓冲区数据量达到阈值,异步线程进行数据落盘,或者设置定期数据落盘。当时间达到上报时间点后,内部调度线程会调用外部实现接口,进行数据上传,上层上传成功或失败后通知底层,底层进行相应策略调整,根据策略决定下次触发文件上传时间,到达时间点后再次触发上传。
demo 的使用请参考这里。
- 在项目跟目录build.gradle中加入 repositories { mavenCentral() }
- 在项目build.gradle中加入 implementation 'io.github.luojilab:datatranshub:1.2.8'
- 按照demo的调用方式接入
准备条件:
- AndroidStudio3.1及以上版本
- android-ndk-r14b及以上版本
步骤:
- AndroidStuido打开源码路径project/android AndroidStuido项目文件
- 打开AndroidStudio中File菜单,Project Structure菜单
- 在Android NDK location中配置NDK位置
- 在AndroidStuido中的Gradle菜单中找到位于Android菜单下的datareporter,在Tasks中找到build,选择assembleRelease进行编译。
- 生成datatranshub-release.aar 导入到项目中进行使用
/**
* 创建DataTransHub实例
*
* @param cacheDir 缓存路径,必须全局唯一,不同业务不同路径
* @param dataDir 数据存储路径,必须全局唯一,不同业务不同路径
* @param encryptKey 缓存和数据加密的key,需要通过脚本生成
* @return
*/
public synchronized static DataTransHub makeDataTransHub(String cacheDir, String dataDir, String encryptKey);
/** * 释放上报实例 * * @param dataTransHub 需要释放的实例 * @param releaseDataTransHub */ public synchronized static void releaseDataTransHub(DataTransHub dataTransHub);
/**
* 设置数据文件上传实现方法
*
* @param uploadImp 文件上传的实现
*/
public synchronized void setUploadImp(IUploadImp uploadImp);
/**
* 设置上传文件最大的尺寸,单位字节
*
* @param fileMaxSize 最大尺寸
*/
public synchronized void setFileMaxSize(long fileMaxSize);
/**
* 设置缓存buffer的大小,该大小不应该大于单文件最大尺寸,单位字节
*
* @param bufferSize buffer的尺寸
*/
public synchronized void setBufferSize(long bufferSize);
/**
* 设置文件上报的有效期,单位是秒,如果设置为0则所有数据都上报,不存在过期逻辑
*
* @param expiredTime 有效期
*/
public synchronized void setExpiredTime(long expiredTime);
/**
* 设置上报间隔,防止上报过度频繁,影响网络。可设置间隔上报
*
* @param reportingInterval 上报间隔 单位毫秒
*/
public synchronized void setReportingInterval(long reportingInterval);
/**
* 设置重试间隔,一次上报失败后,重试阶梯通过该方法设置,防止上报失败后马上进行重试,通过该参数设置重试阶梯
*
* @param retryInterval 单位毫秒
*/
public synchronized void setRetryInterval(long retryInterval);
/**
* 设置数据文件前缀,用于方便过滤数据文件,可不传
*
* @param prefix 文件前缀
*/
public synchronized void setDataFilePrefix(String prefix);
/**
* 设置上报策略,如果设置为UploadTriggerWayWayManual,则不会自动上报,需要手动触发上报
*
* @param uploadTriggerWay UploadTriggerWayWayAuto 或者 UploadTriggerWayWayManual
*/
public synchronized void setUploadTriggerWayWay(int uploadTriggerWay);
/**
* 手动触发上传方法,如果策略设置为手动,则通过这个方法进行触发
*
* @param callback 上传成功后的回调
*/
public synchronized void manualTriggerUpload(IUploadCallback callback)
/**
* 设置写入周期,多久数据落盘一次,0表示不进行周期落盘,完全依赖缓冲区阈值控制
*
* @param period 单位毫秒
*/
public synchronized void setWriteDiskPeriod(long period);
/**
* 实例上报开始,设置完参数后调用该方法
*
*/
public synchronized void start()
/**
* 唤醒方法,当持续上报失败,会触发延长重试策略,当网络转好后,可以通过该方法马上触发再次上报
*
*/
public synchronized void reaWaken()
/**
* 真正的上报数据方法,通过该方法传入数据,然后大量数据存储磁盘成单文件
*
* @param data 字节数据
*/
public synchronized void push(byte[] data)
/**
* 通知上传成功,当上传成功后调用该方法
*
* @param filePath 需要上传的文件路径
*/
public synchronized void notifyUploadSuccess(String filePath)
/**
* 通知上传失败,当上传失败后调用该方法
*
* @param filePath 需要上传的文件路径
*/
public synchronized void notifyUploadFailed(String filePath)
/**
* 上传文件的真正实现接口,需要上层实现该接口
*
* @param filePath 需要上传的文件路径
*/
public interface IUploadImp {
void upload(String filePath);
}
-keep class com.iget.datatranshub.**{*;} -keep class com.iget.flog.**{*;}
- 拷贝release\iOS下对应架构的静态库文件导入到应用项目
- 参照下面的调用方式接入
准备条件:
- xcode最新版本
- cmake最新版本
步骤:
- 使用终端进入项目中build/iOS目录
- 编译真机版本库执行 build_all.sh 执行后生成的Framwork在libs/all目录下
- 编译模拟器版本库执行 build_x86_64.sh 执行后生成的Framwork在libs/x86_64目录下
- 生成调试工程执行 generate_project.sh 执行后会生成调试的xcode工程,工程文件在build文件夹下
/**
* 创建DataTransHub实例
*
* @param cacheDir 缓存路径,必须全局唯一,不同业务不同路径
* @param dataDir 数据存储路径,必须全局唯一,不同业务不同路径
* @param encryptKey 缓存和数据加密的key,需要通过脚本生成
* @return
*/
(instancetype)log_MakeLogCacheDir:(NSString *) cacheDir dataDir:(NSString *) dataDir encryptKey:(NSString *) encryptKey
/** * 释放上报实例 * */ (void)log_Destroy
/**
* 设置数据文件上传实现方法
*
* @param callBack 文件上传的实现
*/
(void)log_SetUploadBlock:(void (^)(NSString *filePath)) callBack;
/**
* 设置上传文件最大的尺寸,单位字节
*
* @param fileMaxSize 最大尺寸
*/
(void)log_SetFileMaxSize:(NSUInteger) fileSize
/**
* 设置缓存buffer的大小,该大小不应该大于单文件最大尺寸,单位字节
*
* @param bufferSize buffer的尺寸
*/
(void)log_SetBufferSize:(NSUInteger) bufferSize
/**
* 设置文件上报的有效期,单位是秒,如果设置为0则所有数据都上报,不存在过期逻辑
*
* @param expiredTime 有效期
*/
(void)log_SetExpiredTime:(NSTimeInterval) expiredTime
/**
* 设置上报间隔,防止上报过度频繁,影响网络。可设置间隔上报
*
* @param reportingInterval 上报间隔 单位毫秒
*/
(void)log_SetReportingInterval:(NSTimeInterval) reportingInterval
/**
* 设置重试间隔,一次上报失败后,重试阶梯通过该方法设置,防止上报失败后马上进行重试,通过该参数设置重试阶梯
*
* @param retryInterval 单位毫秒
*/
(void)log_SetRetryInterval:(NSTimeInterval) retryInterval
/**
* 设置数据文件前缀,用于方便过滤数据文件,可不传
*
* @param prefix 文件前缀
*/
(void)log_SetDataFilePrefix:(NSString *) filePrefix
/**
* 设置上报策略,如果设置为UploadTriggerWayWayManual,则不会自动上报,需要手动触发上报
*
* @param uploadTriggerWay UploadTriggerWayWayAuto 或者 UploadTriggerWayWayManual
*/
(void)log_SetUploadTriggerWayWay:(HubUploadTriggerWay) uploadTriggerWay
/**
* 手动触发上传方法,如果策略设置为手动,则通过这个方法进行触发
*
* @param completionHandler 上传成功后的回调
*/
(void)log_ManualTriggerUploadCompletionHandler:(dispatch_block_t) completionHandler
/**
* 设置写入周期,多久数据落盘一次,0表示不进行周期落盘,完全依赖缓冲区阈值控制
*
* @param period 单位毫秒
*/
(void)data_SetWriteDiskPeriod:(NSUInteger) period
/**
* 实例上报开始,设置完参数后调用该方法
*
*/
(void)log_Start
/**
* 唤醒方法,当持续上报失败,会触发延长重试策略,当网络转好后,可以通过该方法马上触发再次上报
*
*/
(void)log_ReaWaken
/**
* 真正的上报数据方法,通过该方法传入数据,然后大量数据存储磁盘成单文件
*
* @param data 字节数据
*/
(void)data_PushData:(NSData *) data
/**
* 通知上传成功,当上传成功后调用该方法
*
* @param filePath 需要上传的文件路径
*/
(void)log_NotifyUploadSuccess:(NSString *) filePath
/**
* 通知上传失败,当上传失败后调用该方法
*
* @param filePath 需要上传的文件路径
*/
(void)log_NotifyUploadFailed:(NSString *) filePath
还有其他问题?
- 参看 DataTranshHub/sample;
- 阅读 源码;
- 阅读 wiki;
- 联系我们。得到电子书技术组 wx:hlj-lixiaoyu
- 开发成员: 跨平台、android:李晓宇 iOS对接层:由振北 go语言解密算法:刘思远
感谢腾讯团队开源的MMKV项目。本项目借鉴了部分源码。 感谢开源。
DataTransHub 使用的 MIT 协议,详细请参考 LICENSE。