前些天有幸和一位移動(dòng)端的架構(gòu)師一起探討了移動(dòng)端日志采集、存儲(chǔ)镶骗、上傳的架構(gòu)設(shè)計(jì)桶现,受益匪淺。在此總結(jié)一下卖词。
總體架構(gòu)圖如下:
LogUploadFramework.png
日志采集巩那、存儲(chǔ)吏夯、上傳三要素:
1. 客戶端。用戶在客戶端上的操作可以產(chǎn)生日志即横,包括用戶交互動(dòng)作噪生,網(wǎng)絡(luò)請(qǐng)求結(jié)果等。
2. 數(shù)據(jù)庫(kù)东囚。保存日志適合用數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)跺嗽,便于進(jìn)行增刪改查操作。
3. 服務(wù)器页藻。移動(dòng)端將日志上傳到服務(wù)器桨嫁,由服務(wù)器對(duì)日志做進(jìn)一步分析處理。
日志類(lèi)型
移動(dòng)端的日志并沒(méi)有統(tǒng)一的分類(lèi)標(biāo)準(zhǔn)份帐,在此僅僅列出三個(gè)可供參考的日志分類(lèi):
1. 及時(shí)上傳的日志璃吧。例如,崩潰日志废境。
2. 定時(shí)或定量上傳的日志畜挨。例如,某個(gè)按鈕被點(diǎn)擊的次數(shù)噩凹。
3. 用于本地調(diào)試巴元,不需要上傳的日志。例如驮宴,某個(gè)接口的響應(yīng)結(jié)果逮刨。
上傳日志優(yōu)先級(jí)
對(duì)應(yīng)不同的日志類(lèi)型,建議設(shè)置不同的上傳優(yōu)先級(jí):
1. 立即上傳堵泽。
2. 定時(shí)或定量上傳修己。
3. 無(wú)需上傳。
數(shù)據(jù)庫(kù)分表及建立索引
對(duì)應(yīng)不同類(lèi)型的日志落恼,建議分成不同的表箩退,便于對(duì)日志進(jìn)行增刪改查操作。
日志較多時(shí)佳谦,建議建立索引便于查詢和刪除戴涝。
日志三要素的協(xié)調(diào)者:checker、uploader
checker: 校驗(yàn)工具類(lèi)钻蔑。用于讀取數(shù)據(jù)庫(kù)中的數(shù)據(jù)啥刻,檢查是否有日志符合上傳的條件,一旦有符合上傳條件的日志咪笑,就通知uploader可帽。
uploader: 上傳工具類(lèi)。用于根據(jù)上傳條件窗怒,從數(shù)據(jù)庫(kù)中取數(shù)據(jù)映跟,并上傳蓄拣。根據(jù)上傳結(jié)果,更新數(shù)據(jù)庫(kù)或通知checker做進(jìn)一步處理努隙。
觸發(fā)日志上傳校驗(yàn)的事件
移動(dòng)端的日志何時(shí)上傳球恤,需要一個(gè)觸發(fā)機(jī)制。一般而言荸镊,可分為:
1. 日志存儲(chǔ)成功后咽斧,若是需要立即上傳的日志,主動(dòng)觸發(fā)一個(gè)立即上傳的事件
2. APP啟動(dòng)時(shí)事件
3. APP從后臺(tái)切換到前臺(tái)事件
4. 日志上傳失敗
三要素及三要素的協(xié)調(diào)者設(shè)計(jì)原則
-
各司其職躬存。
* client負(fù)責(zé)搜集日志张惹,并將日志傳給storage。 * storage用于存儲(chǔ)日志岭洲,并對(duì)外提供增刪改查的接口. * checker負(fù)責(zé)在合適的時(shí)機(jī)宛逗,查詢storage中是否有符合上傳的日志,一旦有符合上傳的日志盾剩,便交由uploader進(jìn)一步處理. * uploader從storage中讀取數(shù)據(jù)拧额,并發(fā)起網(wǎng)絡(luò)請(qǐng)求,上傳到server彪腔。
-
設(shè)計(jì)模式--工廠模式
* 日志分為不同的類(lèi)型,對(duì)應(yīng)不同類(lèi)型的日志有不同的處理過(guò)程进栽,例如德挣,存儲(chǔ)、校驗(yàn)快毛、上傳格嗅。 * 盡管處理過(guò)程不同,但他們的處理過(guò)程有相似之處唠帝,只是在具體實(shí)現(xiàn)上有部分差異屯掖。 * 工廠模式--定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)襟衰。
其他細(xì)節(jié)
* 失敗重傳策略
* 不同網(wǎng)絡(luò)狀態(tài)下贴铜,上傳策略的優(yōu)化
* 數(shù)據(jù)庫(kù)建立索引字段的選擇
* checker查詢數(shù)據(jù)庫(kù)粗略查詢VS精確查詢。例如瀑晒,查詢需要定量上傳的日志時(shí)绍坝,只統(tǒng)計(jì)每條日志的粗略size,而非精確地size,可提升查詢效率