背景

app打点日志的上报和收集,是互联网公司的基本需求。

一.方案选择

1.1 protobuffer vs json

探究一种以最高效的方式上报和解析打点数据是一个系统性的问题,需要解决的子问题有很多,例如降低网络传输成本,减少序列化反序列化的性能开销,可靠性和高峰期的水平扩展,以及非耦合的编码等等。

很多公司的打点日志会采用比较简单通用的json格式来上报,比如"第四范式"的先荐系统就是使用json格式作为数据上报格式的,这样做便于开发和理解,但是从处理性能方面来考虑并不是最好的选择。

附上protobuffer和json的序列化反序列化性能评测对比: http://www.52im.net/thread-772-1-1.html

在2019年的数据库峰会上,腾讯广告联盟的负责人曾介绍了广告数据平台的原始日志格式,用的就是protobuffer,并且为了方便直接查原始数据格式,自研了一个名为dragon的数据存储格式。

1.2  OpenResty (nginx+lua)

Nginx作为一款开源高性能且稳定的web服务器,经历了10年的发展,已经打败了Apache,IIS等巨头,成为了互联网界的新宠。

Nginx的异步非阻塞,以及模块化的特性,再加上lua脚本的轻量级的特性,让我们很方便的就能开发出一套可扩展且高可靠性的日志收集系统,开发人员只需要关注功能实现本身即可。

1.3 处理流程图

这里只画出了收集部分的步骤,通过Flume收集和处理日志的步骤请见我的另一篇博客:《将nginx收集的日志通过flume转到hive》

二.实现步骤

2.1 定义日志格式

由于每个客户端5秒发送一批日志,可能会包含1条或者多条,为了防止重复发送uuid、客户端版本号等在一次发送周期中不会改变的数据,可以抽取这部分客户端公共的属性作为独立字段;而如点击、播放、翻页等非公共的属性才通过protobuf数组的形式发送。

post日志的上传格式如下:

1) body就是事件体数组部分,每个事件单独一条数据;

2)其他的字段是可共用的公共属性部分,一批事件中这些属性相同。

3)token字段是信令字段,如果token错误,则可能是身份不明者伪造的上报数据。token的格式是(时间戳+密钥)的md5编码。密钥部分可以随意指定,客户端和服务端保持一致即可。出于安全考虑本处打码。

 eventobj的格式定义:

event:{

'eventtype': 'sv', #事件类型

'pg': 'home' #事件发生的一级页面

'spg': 'recommend' #事件发生的二级页面

 'ts': 1527238632,  #timestamp 为事件发生的unix时间戳(+当前时区),精确到秒 

 'arg': ''  # 字符串类型,每个事件对应的其他参数,可能0个或者多个,0个的为空字符串,多个的话用符号&链接。

 }

2.2 编写event.proto文件

本文中不会详细的介绍protobuffer的知识,只会针对该案例讲解操作步骤。如需要了解更多protobuffer的知识可以自行学习。

(有个比较坑的地方是工信部禁了developers.google.com,苦了找文档的各位童鞋。)

如下示例中指定了若干事件类型,若干一级页面和二级页面。文件名为event.proto。

syntax = "proto3";  //protobuff 

option java_outer_classname = "EventsProtos";

message Event {

  enum T { // event type
SCANV = 0; // sv, scan video
PLAYV = 1; // pv, play video
LIKEV = 6;//lv, like video
CLIKEV = 7; // clv, canceld like video
SHAREV = 8; //shv, share video
} enum Pg{ // first level page type
HOME = 0; //
SEARCH = 1; //
UPLOAD = 2; //
} enum Spg{ // second level page type
RECOMMEND = 0; //home
FRESH = 1; // home
HOT = 2; //home
} T eventtype = 1;
Pg pg = 2;
Spg spg = 3;
int32 ts = 4;
string arg = 5; } message Events {
repeated Event events = 1;
}

2.3 生成protobuffer客户端文件。

EventsProtos.java 为Android 端用, Events.pbobjc.h Events.pbobjc.m 为ios端用,

2.4 让OpenResty的lua模块支持protobuffer

1 mkdir /root/project/
2 mkdir /root/project/lua-protobuf
3 git clone https://github.com/starwing/lua-protobuf lua-protobuf/
4 cd lua-protobuf/
5 gcc -O2 -I/usr/local/openresty/luajit/include/luajit-2.1/ -fPIC -shared -Wl,-rpath=./ pb.c -o pb.so
6 cp pb.so /usr/local/openresty/lualib/
7 cp serpent.lua /usr/local/openresty/lualib/
8 cp protoc.lua /usr/local/openresty/lualib/

实战:一种在http请求中使用protobuffer+nginx+lua收集打点日志的方案的更多相关文章

  1. 一次请求中,经过 nginx+uWSGI+flask应用程序搭建服务的执行过程

    Flask框架有自带的http server,但是缺点非常明显,并发能力,及时响应非常差,只适合开发时自测使用. 在我接触过的项目中,生产环境使用nginx+uWSGI+flask应用程序进行部署服务 ...

  2. Spring RestTemplate中几种常见的请求方式

    https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...

  3. Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求

    Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939   版权声明 ...

  4. HTTP协议以及HTTP请求中8种请求方法

    HTTP协议以及HTTP请求中8种请求方法 什么是协议? 协议,是指通信的双方,在通信流程或内容格式上,共同遵守的标准. 什么是http协议? http协议,是互联网中最常见的网络通信标准. http ...

  5. (七)四种常见的post请求中的参数形式

    原文链接:https://blog.csdn.net/jiadajing267/article/details/87883725 1).HTTP 协议是以 ASCII 码 传输,建立在 TCP/IP ...

  6. 将前端请求中的数据绑定到Spring MVC响应方法中参数的四种方法

    一.映射URL绑定的占位符到方法参数 1.方法 使用@PathVariable注解 2.代码示例 a.接收请求方法 @RequestMapping(value = "/deleteInfo/ ...

  7. Python接口测试实战2 - 使用Python发送请求

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  8. MySQL实战 | 06/07 简单说说MySQL中的锁

    原文链接:MySQL实战 | 06/07 简单说说MySQL中的锁 本文思维导图:https://mubu.com/doc/AOa-5t-IsG 锁是计算机协调多个进程或纯线程并发访问某一资源的机制. ...

  9. Spring Security 实战干货:OAuth2授权请求是如何构建并执行的

    在Spring Security 实战干货:客户端OAuth2授权请求的入口中我们找到了拦截OAuth2授权请求入口/oauth2/authorization的过滤器OAuth2Authorizati ...

随机推荐

  1. 【Eclipse+PyDev】使用Python的IDE安装及配置详解

    转的文章 https://blog.csdn.net/jkwwwwwwwwww/article/details/51338230 https://blog.csdn.net/Jkwwwwwwwwww/ ...

  2. 访问github太慢?我写了一个开源小工具一键变快

    前言 GitHub应该是广大开发者最常去的站点,这里面有大量的优秀项目,是广大开发者寻找资源,交友学习的好地方.尤其是前段时间GitHub公布了一项代码存档计划--Arctic Code Vault, ...

  3. (转载)std::enable_if 的几种用法 c++11

    今天看confluo源码中看到了std::enable_if这一个我不了解的语法,所以记录下来 转载地址:https://yixinglu.gitlab.io/enable_if.html std:: ...

  4. 小白一样能建站——winser2012 IIS8.0搭建基本的网站

    在window server 2012环境下,搭建一个基本的 网站.能够使用即可. 打开服务器管理器 添加角色和功能 默认下一步 下一步, 下一步,选择web服务器 添加功能 下一步, 下一步,不安装 ...

  5. asp .net core 静态文件资源

    前言 对静态资源的简单的一个概况,在<重新整理.net core 计1400篇>系列后面会深入. 正文 我们在加入中间件是这样写的: app.UseStaticFiles(); 默认是给w ...

  6. 力扣Leetcode 179. 最大数 EOJ 和你在一起 字符串拼接 组成最大数

    最大数 力扣 给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 说 ...

  7. 微信小程序如何快速开通流量主

    1.先开发小程序,小程序需要有亮点,毕竟新颖(这样别人才更好去点击查看) 2.条件是独立访客(UV)不低于1000,1000人说多不多,说少也不少,因为小程序是没有链接的,是不可以进行一个流量刷取的, ...

  8. js判断传递参数的的类型,并返回

    function   type(target) { var templet  ={ "[object Array]" :  "arry"; "[obj ...

  9. CRMEB小程序商城v4.0二次开发对接集成阿里云短信

    作者:廖飞 - CRMEB小程序商城研发项目组长 前言 cremb小程序商城v4.0版本支持短信平台为云信,但有部分用户有需求对接阿里云短信,这篇文章将对阿里云短信平台如何对接方以及对接流程详细说明. ...

  10. laya资源版本管理

    layaair-cmd https://ldc.layabox.com/doc/?nav=zh-as-3-4-2 Laya的版本管理 https://blog.csdn.net/qq_43287088 ...