欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語言做定時任務(wù) golang計時

Golang-基于TimeingWheel定時器

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

超過10余年行業(yè)經(jīng)驗,技術(shù)領(lǐng)先,服務(wù)至上的經(jīng)營模式,全靠網(wǎng)絡(luò)和口碑獲得客戶,為自己降低成本,也就是為客戶降低成本。到目前業(yè)務(wù)范圍包括了:網(wǎng)站設(shè)計、成都網(wǎng)站制作,成都網(wǎng)站推廣,成都網(wǎng)站優(yōu)化,整體網(wǎng)絡(luò)托管,小程序開發(fā),微信開發(fā),App定制開發(fā),同時也可以讓客戶的網(wǎng)站和網(wǎng)絡(luò)營銷和我們一樣獲得訂單和生意!

在這當(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 包中, 也就是維護了一個任務(wù)池,任務(wù)池中的任務(wù)會有序的執(zhí)行,方便管理。

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

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

數(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ù)進行處理,然后發(fā)布響應(yīng)的事件。 backend 收到事件后進行統(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

基于gocron實現(xiàn)的定時任務(wù)服務(wù)降級方案

目前APP業(yè)務(wù)中啟用的定時任務(wù)已達到400+,目前管理比較混亂,很多任務(wù)運行時占用服務(wù)器資源巨大,其中不乏一些非緊急的任務(wù),平時并不會有太大影響,但是當(dāng)流量高峰來臨時,這些定時任務(wù)可能會成為壓死駱駝的最后一根稻草。為了避免出現(xiàn)這樣的問題,我們通常會在高流量來之前去調(diào)整一些定時任務(wù)的執(zhí)行間隔時間或者暫停一些不影響服務(wù)的定時任務(wù)。這樣做的弊端是工作量很大,同時難免會有遺漏。由此衍生除了對任務(wù)分級的訴求。對任務(wù)分級后,高峰流量時,可視情況降級相關(guān)等級的定時任務(wù)。

? PS:設(shè)計核心流程的任務(wù)等,如支付回調(diào)

? PS:任務(wù)中設(shè)計到事務(wù)等

基于gocron的任務(wù)節(jié)點做任務(wù)分級,不同級別的任務(wù)對應(yīng)不同的gocron節(jié)點。如下圖:

把三級任務(wù)放在三級節(jié)點上跑,如下圖:

以此類推,不同級別的任務(wù)跑在對應(yīng)級別的節(jié)點上。

當(dāng)流量高峰來臨時,我們想通過停掉所有三級任務(wù)來實現(xiàn)快速降級,而這個操作僅僅需要關(guān)閉對應(yīng)節(jié)點的連接即可。如下圖

PS:這個操作同時會停止所有正在運行的任務(wù)

舉個例子:目前我的三級任務(wù)節(jié)點上運行了一個同步數(shù)據(jù)的任務(wù)(預(yù)計5分鐘左右能執(zhí)行完),當(dāng)我把三級任務(wù)節(jié)點關(guān)閉時,這個任務(wù)會直接失敗,在節(jié)點對應(yīng)的機器上我們可以看到所有進程也被直接kill掉了,即使我的任務(wù)是多進程在跑,相應(yīng)的子進程也會被kill掉。如下:

當(dāng)前正在服務(wù)的三級節(jié)點-asgard三級定時任務(wù)

當(dāng)前正在節(jié)點-asgard三級定時任務(wù)上運行的任務(wù)-商品數(shù)據(jù)整合同步搜索個推庫

節(jié)點服務(wù)器上正在運行的進程

這時候我們關(guān)閉asgard三級定時任務(wù)這個節(jié)點

可以看到任務(wù)直接執(zhí)行失敗了

同時,節(jié)點服務(wù)器上的進程也被kill掉了

由于二級任務(wù)可能涉及到事務(wù)等操作,非萬分緊急情況下不能直接終止,以免導(dǎo)致臟數(shù)據(jù)的產(chǎn)生。對于這種任務(wù)的降級我們不能直接通過節(jié)點的方式停止任務(wù)。可以通過關(guān)閉任務(wù)的方式停止。如下:

PS:關(guān)閉任務(wù)的操作會等當(dāng)前的任務(wù)執(zhí)行完成再關(guān)閉,不會對當(dāng)前任務(wù)產(chǎn)生任何影響

舉個例子:

還拿asgard三級定時任務(wù)這個節(jié)點來看,目前這個節(jié)點在鏈接狀態(tài)

這個節(jié)點下跑了一個任務(wù)

同樣的,節(jié)點服務(wù)器上有對應(yīng)的進程在跑著

這時候,我們關(guān)閉這個任務(wù)

我們可以看到,關(guān)閉這個任務(wù),不會影響正在執(zhí)行的任務(wù)

節(jié)點對應(yīng)的服務(wù)器上的任務(wù)也正常在跑

PS:這個關(guān)閉任務(wù)對應(yīng)的是,完成當(dāng)前任務(wù)后不再執(zhí)行新的任務(wù)。

1、基于gocron的任務(wù)節(jié)點對任務(wù)做分級處理

2、一、二、三級任務(wù)的劃分

3、服務(wù)降級的兩種方式:關(guān)閉節(jié)點關(guān)閉任務(wù)

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

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

Etcd

Cron

源碼鏈接

分享名稱:go語言做定時任務(wù) golang計時
文章源于:http://www.chinadenli.net/article14/dddjpde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作定制網(wǎng)站服務(wù)器托管企業(yè)建站搜索引擎優(yōu)化品牌網(wǎng)站建設(shè)

廣告

聲明:本網(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)

搜索引擎優(yōu)化