go語言的定時任務(wù)框架 golang計劃任務(wù)

開源數(shù)據(jù)統(tǒng)計平臺 -- GoAnalytics

本項目用于移動端的數(shù)據(jù)統(tǒng)計,項目地址: 。開源的數(shù)據(jù)統(tǒng)計countly做的很好,但是基礎(chǔ)免費版的功能實在不夠看,因此我就決定用go語言來寫了這個項目,一來可以在實踐中學(xué)習(xí)go語言,二來也可以開發(fā)功能完整的開源平臺。該項目正在開發(fā)中,歡迎有興趣的gopher一起參與。

四川ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

數(shù)據(jù)存儲方面使用的是mongodb。由于數(shù)據(jù)統(tǒng)計業(yè)務(wù)幾乎不涉及到事務(wù)以及嚴(yán)格的一致性場景,而且mongodb的自動分片功能可以支撐較大的數(shù)據(jù)量。使用大數(shù)據(jù)的存儲組件的話就太過于重了。因此選用mongodb。

業(yè)務(wù)邏輯整體基于事件的發(fā)布訂閱。當(dāng)收到客戶端請求, frontend 會對請求數(shù)據(jù)進(jìn)行處理,然后發(fā)布響應(yīng)的事件。 backend 收到事件后進(jìn)行統(tǒng)計處理。

后臺展示基于Vue-Admin-Template開發(fā),本人前端能力基本就是依葫蘆畫瓢,希望有前端大神來開發(fā)后臺頁面,項目地址:

目前客戶端API僅有2個。一個是上報 openApp 打開APP時間,一個是上報 usageTime 一次啟動使用時長事件。SDK方面也需要移動端的大神開發(fā),感興趣的大佬可以一起開發(fā)。

下面放一點后臺頁面的效果圖:

GoAnalytics是基于go實現(xiàn)的一個數(shù)據(jù)統(tǒng)計平臺,用于統(tǒng)計移動端的數(shù)據(jù)指標(biāo),比如啟動次數(shù)、用戶增長、活躍用戶、留存等指標(biāo)分析。前端數(shù)據(jù)展示項目是 goanalytics-web 。目前正在積極開發(fā)中,歡迎提交新的需求和pull request。

Go版本需要支持module,本地開發(fā)測試

cmd/goanalytics_kafka 和 goanalytics_rmq 是分別基于 kafka 和 rocketmq 的發(fā)布訂閱功能做的數(shù)據(jù)發(fā)布

和訂閱處理,橫向擴展能力比 local 高。另外由于 rocketmq 還沒有原生基于 go 的客戶端(原生客戶端正在開發(fā)中

2.0.0 road map ),可能會存在問題。

項目結(jié)構(gòu)

├── README.md

├── api

│ ├── authentication 用戶認(rèn)證、管理API

│ ├── middlewares GIN 中間件

│ └── router API route

├── cmd

│ ├── account 生成admin賬號命令

│ ├── analytic_local 不依賴消息系統(tǒng)的goanalytics

│ ├── goanalytics_kafka 基于kafak的goanalytics

│ ├── goanalytics_rmq 基于rocketmq的goanalytics

│ └── test_data 生成測試數(shù)據(jù)命令

├── common

│ └── data.go

├── conf 配置

│ └── conf.go

├── event

│ ├── codec 數(shù)據(jù)編解碼

│ └── pubsub 消息發(fā)布訂閱

├── go.mod

├── go.sum

├── metric 所有的統(tǒng)計指標(biāo)在這里實現(xiàn)

│ ├── init.go

│ └── user 用戶相關(guān)指標(biāo)的實現(xiàn)

├── schedule

│ └── schedule.go 定時任務(wù)調(diào)度

├── storage 存儲模塊

│ ├── counter.go 計數(shù)器接口

│ ├── data.go

│ └── mongodb 基于mongodb實現(xiàn)的存儲及計數(shù)器

└── utils

├── date.go

├── date_test.go

├── errors.go

└── key.go

Golang-基于TimeingWheel定時器

在linux下實現(xiàn)定時器主要有如下方式

在這當(dāng)中 基于時間輪方式實現(xiàn)的定時器 時間復(fù)雜度最小,效率最高,然而我們可以通過 優(yōu)先隊列 實現(xiàn)時間輪定時器。

優(yōu)先隊列的實現(xiàn)可以使用最大堆和最小堆,因此在隊列中所有的數(shù)據(jù)都可以定義排序規(guī)則自動排序。我們直接通過隊列中 pop 函數(shù)獲取數(shù)據(jù),就是我們按照自定義排序規(guī)則想要的數(shù)據(jù)。

在 Golang 中實現(xiàn)一個優(yōu)先隊列異常簡單,在 container/head 包中已經(jīng)幫我們封裝了,實現(xiàn)的細(xì)節(jié),我們只需要實現(xiàn)特定的接口就可以。

下面是官方提供的例子

因為優(yōu)先隊列底層數(shù)據(jù)結(jié)構(gòu)是由二叉樹構(gòu)建的,所以我們可以通過數(shù)組來保存二叉樹上的每一個節(jié)點。

改數(shù)組需要實現(xiàn) Go 預(yù)先定義的接口 Len , Less , Swap , Push , Pop 和 update 。

timerType結(jié)構(gòu)是定時任務(wù)抽象結(jié)構(gòu)

首先的 start 函數(shù),當(dāng)創(chuàng)建一個 TimeingWheel 時,通過一個 goroutine 來執(zhí)行 start ,在start中for循環(huán)和select來監(jiān)控不同的channel的狀態(tài)

通過for循環(huán)從隊列中取數(shù)據(jù),直到該隊列為空或者是遇見第一個當(dāng)前時間比任務(wù)開始時間大的任務(wù), append 到 expired 中。因為優(yōu)先隊列中是根據(jù) expiration 來排序的,

所以當(dāng)取到第一個定時任務(wù)未到的任務(wù)時,表示該定時任務(wù)以后的任務(wù)都未到時間。

當(dāng) getExpired 函數(shù)取出隊列中要執(zhí)行的任務(wù)時,當(dāng)有的定時任務(wù)需要不斷執(zhí)行,所以就需要判斷是否該定時任務(wù)需要重新放回優(yōu)先隊列中。 isRepeat 是通過判斷任務(wù)中 interval 是否大于 0 判斷,

如果大于0 則,表示永久就生效。

防止外部濫用,阻塞定時器協(xié)程,框架又一次封裝了timer這個包,名為 timer_wapper 這個包,它提供了兩種調(diào)用方式。

參數(shù)和上面的參數(shù)一樣,只是在第三個參數(shù)中使用了任務(wù)池,將定時任務(wù)放入了任務(wù)池中。定時任務(wù)的本身執(zhí)行就是一個 put 操作。

至于put以后,那就是 workers 這個包管理的了。在 worker 包中, 也就是維護(hù)了一個任務(wù)池,任務(wù)池中的任務(wù)會有序的執(zhí)行,方便管理。

Go語言基于Etcd實現(xiàn)的定時任務(wù)

利用 Etcd 的Lease租約特性來實現(xiàn)定時功能,同時通過Watch機制來實現(xiàn)多節(jié)點情況下只有一個節(jié)點執(zhí)行該任務(wù)。通過定時任務(wù)庫 Cron 的時間字符串解析器Parser來解析任務(wù)執(zhí)行時間。

Etcd

Cron

源碼鏈接

網(wǎng)頁標(biāo)題:go語言的定時任務(wù)框架 golang計劃任務(wù)
文章URL:http://muchs.cn/article10/doecgdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、用戶體驗、、品牌網(wǎng)站制作、標(biāo)簽優(yōu)化軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)