基于Kafka的服务端用户行为日志采集
本文来自网易云社区
作者:李勇
背景
随着互联网的不断发展,用户所产生的行为数据被越来越多的网站重视,那么什么是用户行为呢?所谓的用户行为主要由五种元素组成:时间、地点、人物、行为、行为对应的内容。为什么要做用户的行为分析?因为只有做了用户行为分析才能知道用户画像、才能知道用户在网站上的各种浏览、点击、购买背后的商业真相,从而给企业带来商业价值。
网易美学是一个供用户发现和分享美妆及护肤的社区。既然是一个社区,其中的用户行为分析扮演着举足轻重的角色。对应网易美学来说,用户行为主要有以下几个应用场景:
推荐系统。目前的推荐是基于用户的行为,然后运用不同的算法计算出用户应该展现的推荐数据。
拉新。对于一个产品来说,不断的获取新用户是其中一个目标,有更多的新用户使用产品,就意味着该产品能够得到更多人的认可。
转化率。一个用户从注册到各个页面的浏览等行为组成一个漏斗模型,漏斗的每个模型可以看到用户的留存状况。
留存率。一个产品不但能让更多的新用户使用,也要保证老的用户不流失。
促活率。所谓的促活率,就是让老用户经常使用该产品,让用户喜欢上这个平台。
埋点技术
用户的行为对于一个互联网产品来说很重要,因此如何采集用户的行为就变得非常至关重要了。对用户的行为采集可以通过埋点的方式实现,埋点主要有以下几种方式:
前端埋点。在某个控件操作发生时通过预先写好的代码来发数据的代码埋点。
客户端埋点。即app使用一些sdk对用户的行为进行收集然后批量发送到一个收集平台。
服务端埋点。服务端埋点就是通过拦截用户的请求接口,对用户的一些行为信息进行采集。
服务端日志采集
下面我详细介绍下网易美学的服务端日志采集系统使用的技术,总体架构,部署图,运作流程以及配置相关信息。
1. 技术选型
服务端日志采集主要通过在Controller的接口中进行埋点,然后通过AOP技术、Kafka消息系统以及logback对用户行为进行采集。
之所以使用AOP技术是因为AOP的以下重要特定:
代码的侵入性小。对于业务代码的侵入性小,只需要在Controller的接口上添加注解,然后在其他模块对用户行为进行采集。
重用性。对于相同作用的代码可以进行重用。
扩展性。能够很好的对系统进行扩展。
由于使用异步方式对用户行为信息进行收集,因此需要使用消息中间件。目前消息中间件非常多,比较流行的有ActiveMQ、ZeroMQ、RabbitMQ、Kafka等。每个消息中间件都有各种的优势劣势,之所以使用Kafka消息中间件,是因为以下几点因素:
高性能。每秒钟可以处理数以千计生产者生成的消息。
高扩展性。可以通过简单的增加服务器横向扩展Kafka集群的容量。
分布式。消息来自数以千计的服务,使用分布式来解决单机处理海量数据的瓶颈。
持久性。Kafka中的消息可以持久化到硬盘上,这样可以防止数据的丢失。
因为用户的行为数据最终是以日志的形式持久化的,因此使用logback对日志持久化到日志服务器中。
2.总体架构
图1 总体架构图
服务端日志采集系统主要由两个工程组成:beauty-bi-core和beauty-bi-service。由于网易美学的使用dubbo框架,因此有服务提供方和服务消费方。beauty-bi-core被web、wap和mainsite服务消费方依赖。此外,beauty-bi-service也依赖于beauty-bi-core,主要是依赖于其中的一些实体类及工具类。
beauty-bi-core工程为Kafka消息的生产者,主要封装实现切面的具体逻辑,其主要职责如下:
解析用户请求的Request信息:从Request中提取用户的基本信息,如设备型号、用户的供应商、ip、设备的分辨率、设备平台、设备的操作系统、设备id、app渠道等。
接口对应的参数:通过切面可以提取接口的参数值,从而知道用户的业务信息。
应用层返回的结果信息:因为切面使用AfterReturning方式,因此可以获取用层的返回结果,从返回结果中可以提取有用的信息。
用户的基本信息:用户的id信息。
信息格式化:将信息转化成JSON字符串。
发送消息:将最终需要发送的消息放入本地阻塞队列中,通过另一个线程异步从阻塞队列中获取消息并发送到Kafka Broker中。
beauty-bi-service工程为Kafka消息的消费者,其主要职责如下:
实时从Kafka中拉取最新的数据。
将JSON字符串转化成,方便进一步对用信息进行加工。
对用户的ip进行解析,获取ip对应的地区以及经纬度信息。
将加工好的最终信息持久化到log文件中。
3.部署图
图2 部署图
上图为网易美学与日志系统系统相关的部署图,App、Wap和Mainsite服务器集群分别对应不同终端的应用。Kafka集群使用杭研的集群,目前有10个Broker。日志服务器有两台,通过Kafka的均衡策略对日志进行消费。
4.日志采集的流程
日志采集流程图如下所示:
图3 日志打点流程图
上图为消息生产者和消息消费者共同组成的流程图。
消息生产者的具体步骤如下:
通过切面拦截用户的请求。
从切面中提取请求头的基本信息,如设备信息,cookie信息,ip信息等。
提取请求的接口参数信息。
从接口返回值中提取相关信息,如id,pvid等。
将提取的信息封装成JSON字符串,放到阻塞队列中,假如阻塞队列溢出会有三次重试机制。
异步线程从本地阻塞队列中获取数据,并将信息组装发送到Kafka的Broker中,此时消息生产者结束。
消息消费者的具体步骤如下:
实时从Kafka Broker中批量拉取消息。
将拉取的消息转化成对象。
解析ip对应的国家、省份、城市、经纬度信息。
对不同业务场景的信息进一步解析。
将日志信息转化成JSON字符串,持久化到log文件中。
5. 相关配置
application-XXX.properties:该配置放Kafka的相关属性,包括topic、groupId、server等信息。
beauty-log-msg.xml:该配置放在app-web,mainsite-web,wap-web的src/main/resources目录下,主要是初始化kafka生产者的信息。
beauty-bi-service.xml:该配置放在beauty-bi-service工程的src/main/resources目录下,主要用于加载kafka消费者的配置信息,并且启动kafka消费者服务。
logback.xml:该配置放在beauty-bi-service工程的src/main/resources目录下,主要用于声明日志文件存放的目录,需要持久化的日志的package路径,以及日志持久化的格式。
ip_conf.txt:该配置放在beauty-bi-service工程的src/main/resources目录下,用于解析ip对应的地域、经纬度等信息。
网易云大礼包:https://www.163yun.com/gift
本文来自网易云社区,经作者勇授权发布。
相关文章:
【推荐】 3分钟掌握一个有数小技能:制作动态标题
基于Kafka的服务端用户行为日志采集的更多相关文章
- TCP/IP网络编程之基于TCP的服务端/客户端(二)
回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...
- TCP/IP网络编程之基于TCP的服务端/客户端(一)
理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于流(stream)的套接字.TCP是Transmissi ...
- 基于SignalR的服务端和客户端通讯处理
SignalR是一个.NET Core/.NET Framework的实时通讯的框架,一般应用在ASP.NET上,当然也可以应用在Winform上实现服务端和客户端的消息通讯,本篇随笔主要基于Sign ...
- TCP/IP网络编程之基于UDP的服务端/客户端
理解UDP 在之前学习TCP的过程中,我们还了解了TCP/IP协议栈.在四层TCP/IP模型中,传输层分为TCP和UDP这两种.数据交换过程可以分为通过TCP套接字完成的TCP方式和通过UDP套接字完 ...
- 追求极致的用户体验ssr(基于vue的服务端渲染)
首先这篇博客并不是ssr建议教程,需要ssr入门的我建议也不要搜索博客了,因为官网给出了详细的入门步骤,只需要step by step就可以了,这篇博客的意义是如何使用ssr,可能不同的人有不同的意见 ...
- c++ 网络编程(三) LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613027.html 锲子:进程与线程是什么,他们的区别在哪里: 1 进程概念 进程是程序的一 ...
- day112:MoFang:种植园使用websocket代替http&服务端基于flask-socketio提供服务&服务端响应信息&种植园页面显示初始化
目录 1.种植园使用websocket代替http 2.服务端基于socket提供服务 3.服务端响应信息 4.种植园页面展示 1.种植园使用websocket代替http 我们需要完成的种植园,是一 ...
- WebService学习总结(四)--基于CXF的服务端开发
本节将实践目前最流行的第二种web service 发布和调试框架 CXF Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构.它允许创建高性能和可扩 ...
- 基于 xorm 的服务端框架 XGoServer
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
随机推荐
- 配置tomcat远程debug
Linux系统中在编辑catalina.sh文件,修改JAVA_OPTS的变量值为如下即可. JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -Xdebug -Xrunjd ...
- Selenium应用代码(常见封装的方法一)
常见封装的方法:输入.点击.判断元素是否存在.根据句柄切换窗口.根据title切换窗口.滚动窗口.截图 import java.awt.Rectangle;import java.awt.image. ...
- csv文件已经python内置csv模块
csv(Comma Separated Value,即逗号分隔值),文件以纯文本形式存储表格数据(数字和文本).可以用excel打开,并自动将每个逗号隔开的数据作为一列在excel中显示. pytho ...
- 挖矿病毒——test用户的ld-linux-x86-64任务
表现:24核48线程的机器,极度占用系统CPU资源(约60%) 通过top查看之后可以看到排在首位的是test用户的ld-linux-x86-64任务. solution: 首先,/etc/passw ...
- 小修改,让mvc的验证锦上添点花
首先,mvc的客户端验证用的是jquery.validate.js, jquery.validate本身已经提供了很好的扩展功能,通过简单点配置就可以做得更好看些. 而Microsoft通过jquer ...
- vue根据:data-属性值绑定控制class变化
checked的初始值 小bug: v的checked有被修改,但没有被渲染到页面中. 试了子组件修改后的值传回父组件没用. 最后修改数据后调用this.$forceUpdate();即可重新渲染,样 ...
- GitHub Desktop 拉取 GitHub上 Tag 版本代码
一直在使用 GitHub Desktop 图形化 git 管理工具,统一项目框架版本时需要切换到ThinkPHP Tag 分支版本,步骤如下, 1,先在 GitHub 中找到需要的版本,点进去 2,点 ...
- ssh登录等待时间超时问题的解决
最近使用ssh登录服务器时,发现许多服务器会报告等待时间超时的错误,通过网上查找发现是由于ssh中的配置中开启了DNS反查的功能,导致在反查过程中消耗了很长的时间,现将解决方法总结如下: 使用root ...
- diff命令--比较两个文件的命令
可以使用 --brief 来比较两个文件是否相同,使用 -c参数来比较这两个文件的详细不同之处,这绝对是判断文件是否被篡改的有力神器,
- js扩展String.prototype.format字符串拼接的功能
1.题外话,有关概念理解:String.prototype 属性表示 String原型对象.所有 String 的实例都继承自 String.prototype. 任何String.prototype ...