客户端上传数据与服务端队列处理

客户端上传数据

要求

  • 数据包不能无限大,服务端只允许1M大小
  • 数据上传前做 gzip 压缩



参考示例

这里假设采集到的数据是一个 List 集合

xx

代码解释:

  • spliter.GetNextPart() 的返回结果是一个 多行JSON,不是JSON数组
  • 返回结果是一个字符串,长度不超过 6M(参数)
  • 在发送前调用 ToGzip 方法可以实现数据压缩,可以控制在 1M 内



发送数据到服务端:

xx

代码解释:

  • x-datatype : 可用于服务端的兼容性处理(提示作用)
  • Content-Encoding = gzip :服务端就知道这是个 gzip 压缩数据
  • ContentType.Binary:指示请求体是一个二进制数据,避免一些服务端模块错误处理



云端入口服务

这里采用队列来缓冲,防止大量请求突然出现而丢失数据包。

xx

示例代码说明:

  • Action方法中可以不做作任何处理,直接把 request 发到MQ就可以了
  • request在发到MQ时,数据不做解压缩,不做反序列化,能保持数据包在一个较小的长度



订阅队列消息

xx



处理消息

xx

兼容性处理示例

xx



分析总结

  • 借助 DataSpliter 的分割功能,数据包大小可控
  • 上传时使用 gzip 压缩,数据包减少至少8倍
  • 整个过程只有一次JSON序列化和一次反序列化
  • 序列化是一个对象一个对象的进行,反序列化时不会占用大量内存
  • 整个过程只有一次 gzip 压缩 和 解压缩