1. 程式人生 > >基於Kafka的服務端使用者行為日誌採集

基於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對應的地域、經緯度等資訊。

本文來自網易雲社群,經作者勇授權釋出。

相關推薦

基於Kafka服務使用者行為日誌採集

本文來自網易雲社群作者:李勇背景隨著網際網路的不斷髮展,使用者所產生的行為資料被越來越多的網站重視,那麼什麼是使用者行為呢?所謂的使用者行為主要由五種元素組成:時間、地點、人物、行為、行為對應的內容。為什麼要做使用者的行為分析?因為只有做了使用者行為分析才能知道使用者畫像、才能知道使用者在網站上的各種瀏覽、點

kafka客戶打印日誌

width www log4j2 kafka sco config cli eve image kafka 0.10.0 java客戶端使用slf4j作為日誌門面,需要我們加入具體的日誌實現依賴才能打印日誌,日誌框架:http://www.cnblogs.com/se

基於Restful服務的客戶實現(WebClient 和 HttpURLConnection)

前提: 1、Restful風格的WS服務端:Web Service筆記(五):CXF開發RESTful風格的Web Service 2、訪問客戶端的技術太多了,這邊總結下本人使用過的,主要是四種:WebClient 、HttpURLConnection、HttpClient 和Res

kafka 服務消費者和生產者的配置

在kafka的安裝目錄下,config目錄下有個名字叫做producer.properties的配置檔案 #指定kafka節點列表,用於獲取metadata,不必全部指定 #需要kafka的伺服器地址,來獲取每一個topic的分片數等元資料資訊。 metadata.broker.list=kafka0

SoaringRoad基於AWS服務網路架構

文章同步發表在我的個人部落格上 http://www.soaringroad.com/article/123 前言 最近對網站網路進行重構升級,加強安全措施,分享一下實踐經驗。 網路架構 直接上一張圖吧,然後慢慢解釋。 首先,整個系統部署在一個虛擬私有云(Vir

Hadoop-模擬搭建使用者行為日誌採集系統分析

一. kafka應用流程示意1. 前端js埋點,就是呼叫後端提供的對應介面.介面請求示例如下:http://pingserver.com?itemid=111&userid=110&action=show&...為了保證輕量級,冰法度高,前端js埋點向

基於AIX系統的應用日誌採集-Logstash伺服器和客戶配置

1.服務端 1.1.需要檔案(/opt/file):   logstash-forwarder.crt   logstash-forwarder.key    1.2. 執行命令生成金鑰檔案keystor

基於Flume+Log4j+Kafka日誌採集架構方案

Flume 基本概念 Flume是一個完善、強大的日誌採集工具,關於它的配置,在網上有很多現成的例子和資料,這裡僅做簡單說明不再詳細贅述。 Flume包含Source、Channel、Sink三個最基本的概念: Source——日誌來源,其中包括:Avro Source、

基於UDT connect連接通信以及文件傳輸--服務

title set max 能夠 def htons 基於 bre 源代碼下載 網上與UDT相關的資料不多,與UDT相關的源碼例子更少。最近在接觸UDT,也是因為缺少相關的資料,導致學習起來甚感痛苦。下面將我自己這兩天弄出來的代碼貼出來,希望對在尋找相關資料的童鞋有一定的幫

web網站服務基於ip,口,域名

web服務基於ipyum install httpd -yservice httpd startchkconfig httpd onvi /etc/httpd/conf/httpd.conf# Document<VirtualHost 192.168.100.100:80> ServerN

基於thrift的java和python分別作為客戶服務的調用實現

Coding except arr pes com ssa utf-8 encoding 中文亂碼 前面已經實現了純java的thrift的實現。 現在實現實現一下python作為客戶端和服務端的thrift的調用 1.python作為客戶端,java作為服務端 java服

追求極致的用戶體驗ssr(基於vue的服務渲染)

這樣的 console ports modules 為我 返回 意思 mage nop 首先這篇博客並不是ssr建議教程,需要ssr入門的我建議也不要搜索博客了,因為官網給出了詳細的入門步驟,只需要step by step就可以了,這篇博客的意義是如何使用ssr,可能不同的

基於Express 在服務渲染React組件

ejs js模板 安裝 分享圖片 頁面 save 3.3 這一 webp 服務端渲染React組件的思路是: 在服務端先將React組件轉化成字符串,然後將字符串填充到ejs模板中,客戶端就得的了html頁面。但這還沒完,還要在客戶端render 一遍React 組件。這就

4.前端基於react,後基於.net core2.0的開發之路(4) 前端打包,編譯,路由,模型,服務

hub 解決 路徑 export routes run 部署 service 後端 1.簡要的介紹 學習react,首先學習的就是javascript,然後ES6,接著是jsx,通常來說如果有javascript的基礎,上手非常快,但是真正要搭建一個前端工程化項目,還是有很

基於socket.io客戶服務的相互通訊

dem send ins 返回 on() .com cal selector req socket.io是對websocket的封裝,用於客戶端與服務端的相互通訊。官網:https://socket.io/。 下面是socket.io的用法: 1、由於使用express

基於 xorm 的服務框架 XGoServer

加密 iter router com mux develop 目錄 func 基礎 作者:林冠宏 / 指尖下的幽靈 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.c

c++ 網絡編程(四)TCP/IP LINUX/windows下 socket 基於I/O復用的服務代碼 解決多進程服務創建進程資源浪費問題

linux系統中 cin 通過 sel print 大小 查看 服務 集合 原文作者:aircraft 原文鏈接:https://www.cnblogs.com/DOMLX/p/9613861.html 好了,繼上一篇說到多進程服務端也是有缺點的,每創建一個

linux網絡編程之用socket實現簡單客戶服務的通信(基於UDP)

服務端 msg ets lin fgets err n) stderr tcp 單客戶端和服務端的通信(基於UDP) 代碼 服務端代碼socket3.c #include<sys/types.h> #include<sys/socket.h>

基於jrtplib實現的最簡單服務和客戶

使用Jrtplib庫實現服務端和客戶端通訊 程式碼都是直接從jrtplib自帶例子中摳出來的,就是為了方便研究,話不多說直接上菜 服務端程式碼: /* Here's a small IPv4 example for receiver */ /* #incl

基於moongoose的c++ http服務

我最輕量級的c++ http服務端 專案組成 標頭檔案http_server.h 原始檔http_control1.cpp 原始檔http_server.cpp 這只是一個半成品,僅有部分測試函式,需要根據自己的需要做一些修改和完善工作。