一. kafka應用流程示意
1. 前端js埋點,就是調用后端提供的對應接口.接口請求示例如下:
http://pingserver.com?itemid=111&userid=110&action=show&...
為了保證輕量級,并發度高,前端js埋點向后端異步發送的請求不需要關注返回狀態,只負責調用即可;
2. flume監聽log日志,將實時增加的log日志通過flume管道注入kafka中,接下來可以由storm或spark streaming進行實時流處理;
3. 方向(1)中應用:storm,spark streaming更偏重于業務處理及數據挖掘;
4. 方向(2)中應用:是將非結構化的用戶行為日志數據轉換成結構化的數據存入hbase中,使用hive進行行為日志的分析,比如統計pv,uv,vv,ctr,dau等.
二. 搭建日志采集系統log server流程圖
上圖,就是一個Log Server實現的最簡單流程圖.
Nginx分發器:上面提到了前端js埋點請求,要求速度要快,并發度要高,所以這里使用了Nginx分發器作為web server,實現反向代理與LB(負載均衡);
Spawn-cgi:上圖只是示例提供一個server服務的場景,同樣也可以在不同節點上,提供相同的服務,用nginx實現負載均衡,以能提供更快更高可用的服務;
Spawn-cgi的功能: 就是提供了一個網關接口,它可以快速的實現對外暴露server服務的功能,并能使底層的服務變成一個常駐的守護進程;
它的請求走的fcgi協議,這種協議更加適合外部請求,因為http請求很容易受到攻擊;
- Thrift RPC:在定義接口規范之后,能夠幫助我們快速的生成client和server代碼,并能幫助我們實現服務之間的解耦:
- client只負責字段的解析等輕量級的工作;
- server才是真正的引擎核心,我們可以在這里實現自己的業務處理邏輯.
使用Thrift RPC生成的client和server之間的通信,走的是RPC協議,這種協議有如下好處:
- 跨語言,支持多種語言去生成client和server代碼,c++,Python,java等;
- 保證數據的安全,相比http協議更不容易受到外部攻擊;
- 速度快,性能好,比如用c++生成代碼,實現效果性能更好,速度更快,更能應對高并發的處理請求;
RPC協議更加適合底層內部的請求,所以設計上后端一般都是使用RPC協議.
另外,RPC的兩端client和server只要遵循RPC協議和定義的scheme接口通信規范,兩端可以使用不同的開發語言.
4. 上面的client server中server,并不只是一種簡單的服務,它可以由多個server通過RPC協議構成,比如下面搭建推薦系統:
三. 模擬日志收集系統的相關技術功能梳理
- Thrift RPC:在定義接口通信規范后,可以用Thrift命令快速生成server和client代碼,完成最基本的C/S架構;這種生成代碼的方式,可以幫助我們實現服務之間的解耦,client只負責字段的解析等輕量級的工作,而server才是真正的處理引擎;
在server里面,我們可以實現自己的業務處理邏輯.通過glogs可以將收集到用戶行為日志快速高效的寫入log文件中.
- Spawn-CGI: 通過cgi提供的網關接口,可以將自己用thrift rpc生成的server服務提供給外部.
簡單的可以理解為提供了一種代理,可以在非應用程序所在的機器上操作應用程序.
Nginx分發器: 就是web server,用于分發用戶的請求,實現反向代理與負載均衡;通過它可以將用戶的js埋點請求分發給我們的server應用程序去處理;
ab壓測: 如果Thrift RPC使用c++生成client和server,可以大大的提供性能,這種場景下,可以使用ab壓測工具,進行壓力測試;
上面的技術部分,基本就實現了模擬日志收集系統的搭建,下面再擴展做一下介紹.
Flume + Hbase/Hive : 用于用戶行為日志分析;
Flume+Kafka+Storm/Spark Streaming :用于實時流處理的數據挖掘;