客户端上传数据与服务端队列处理
客户端上传数据
要求
- 数据包不能无限大,服务端只允许1M大小
- 数据上传前做 gzip 压缩
参考示例
这里假设采集到的数据是一个 List 集合
代码解释:
- spliter.GetNextPart() 的返回结果是一个 多行JSON,不是JSON数组
- 返回结果是一个字符串,长度不超过 6M(参数)
- 在发送前调用 ToGzip 方法可以实现数据压缩,可以控制在 1M 内
发送数据到服务端:
代码解释:
- x-datatype : 可用于服务端的兼容性处理(提示作用)
- Content-Encoding = gzip :服务端就知道这是个 gzip 压缩数据
- ContentType.Binary:指示请求体是一个二进制数据,避免一些服务端模块错误处理
云端入口服务
这里采用队列来缓冲,防止大量请求突然出现而丢失数据包。
示例代码说明:
- Action方法中可以不做作任何处理,直接把 request 发到MQ就可以了
- request在发到MQ时,数据不做解压缩,不做反序列化,能保持数据包在一个较小的长度
订阅队列消息
处理消息
兼容性处理示例
分析总结
- 借助 DataSpliter 的分割功能,数据包大小可控
- 上传时使用 gzip 压缩,数据包减少至少8倍
- 整个过程只有一次JSON序列化和一次反序列化
- 序列化是一个对象一个对象的进行,反序列化时不会占用大量内存
- 整个过程只有一次 gzip 压缩 和 解压缩