能否支持多機(jī)同時跑 | 一般不能,同一時刻只能單機(jī)跑。 |
存儲數(shù)據(jù)源 | 一般是mysql或者其它傳統(tǒng)數(shù)據(jù)庫,并且是單表存儲 |
頻率 | 支持秒、分、時、天,一般不能太快 |
總上所述我們就知道了一般傳統(tǒng)的定時任務(wù)存在以下缺點:
1、性能瓶頸。只有一臺機(jī)在處理,在大體量數(shù)據(jù)面前力不從心!
2、實效性差。定時任務(wù)的頻率不能太高,太高會業(yè)務(wù)數(shù)據(jù)庫造成很大的壓力!
3、單點故障。萬一跑的那臺機(jī)掛了,那整個業(yè)務(wù)不可用了-。- 這是一個很可怕的事情!
所以傳統(tǒng)定時任務(wù)也不太適合這個業(yè)務(wù)。。。
那我們是不是就束手無策了呢?其實不是的! 我們只要對傳統(tǒng)的定時任務(wù)做一個簡單的改造!就可以把它變成可以同時多機(jī)跑,并且實效性可以精確到秒級,并且拒絕單點故障的定時任務(wù)集群!這其中就要借助我們的強(qiáng)大的redis了。
首先我們要定義定時任務(wù)集群要解決的三個問題!
1、實效性要高
2、吞吐量要大
3、服務(wù)要穩(wěn)定,不能有單點故障
下面是整個定時任務(wù)集群的架構(gòu)圖。
架構(gòu)很簡單:我們把用戶的訂閱推送記錄存儲到redis集群的sortedSet隊列里面,并且以提醒用戶提醒時間戳作為score值,然后在我們個每業(yè)務(wù)server里面起一個定時器頻率是秒級,我的設(shè)定就是1s,然后經(jīng)過負(fù)載均衡之后從某個隊列里面獲取要推送的用戶記錄進(jìn)行推送。下面我們分析以下這個架構(gòu)
1、性能:除去帶寬等其它因素,基本與機(jī)器數(shù)成線性相關(guān)。機(jī)器數(shù)量越多吞吐量越大,機(jī)器數(shù)量少時相對的吞吐量就減少。
2、實效性:提高到了秒級,效果還可以接受。
3、單點故障?不存在的!除非redis集群或者所有server全掛了。。。。
第一redis 可以作為一個高性能的存儲db,性能要比MySQL好很多,并且支持持久化,穩(wěn)定性好。
第二redisSortedSet隊列天然支持以時間作為條件排序,完美滿足我們選出要推送的記錄。
ok~既然方案已經(jīng)有了那如何在一天時間內(nèi)把這個方案落地呢?是的我設(shè)計出這個方案到基本編碼完成,時間就是一天。。。 因為時間太趕鳥。
首先我們以user_id作為key,然后mod隊列數(shù)hash到redis SortedSet隊列里面。為什么要這樣呢,因為如果用戶同時訂閱了兩張劵并且推送時間很近,這樣的兩條推送就可以合并成一條~,并且這樣hash也相對均勻。下面是部分代碼的截圖:
然后要決定隊列的數(shù)量,一般正常來說我們有多少臺處理的服務(wù)器就定義多少條隊列。因為隊列太少,會造成隊列競爭,太多可能會導(dǎo)致記錄得不到及時處理。
然而最佳實踐是隊列數(shù)量應(yīng)該是可動態(tài)配置化的,因為線上的集群機(jī)器數(shù)是會經(jīng)常變的。大促的時候我們會加機(jī)器是不是,并且業(yè)務(wù)量增長了,機(jī)器數(shù)也是會增加是不是~。所以我是借用了淘寶的diamond進(jìn)行隊列數(shù)的動態(tài)配置。
我們每次從隊列里面取多少條記錄也是可以動態(tài)配置的
這樣就可以隨時根據(jù)實際的生產(chǎn)情況調(diào)整整個集群的吞吐量~。 所以我們的定時任務(wù)集群還是具有一個特性就是支持動態(tài)調(diào)整~。
最后一個關(guān)鍵組件就是負(fù)載均衡了。這個是非常重要的!因為這個做得不好就會可能導(dǎo)致多臺機(jī)競爭同時處理一個隊列,影響整個集群的效率!在時間很緊的情況下我就用了一個簡單實用的利用redis一個自增key 然后 mod 隊列數(shù)量算法。這樣就很大程度上就保證不會有兩臺機(jī)器同時去競爭一條隊列~.
最后我們算一下整個集群的吞吐量
10(機(jī)器數(shù)) * 2000(一次拉取數(shù)) = 20000。然后以MQ的形式把消息推送到消息中心,發(fā)MQ是異步的,算上其它處理0.5s。
其實發(fā)送20W的推送也就是10幾s的事情。
ok~ 到這里我們整個定時任務(wù)集群就差不多基本落地好了。如果你問我后面還有什么可以完善的話那就是:
1、加監(jiān)控, 集群怎么可以木有監(jiān)控呢,萬一出問題有任務(wù)堆積怎么辦~
2、加上可視化界面。
3、最好有智能調(diào)度,增加任務(wù)優(yōu)先級。優(yōu)先級高的任務(wù)先運行嘛。
4、資源調(diào)度,萬一機(jī)器數(shù)量不夠,力不從心,優(yōu)先保證重要任務(wù)執(zhí)行。
目前項目已上前線,運行平穩(wěn)~。
到此這篇關(guān)于淺談我是如何用redis做實時訂閱推送的的文章就介紹到這了,更多相關(guān)redis 實時訂閱推送內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:北京 吉安 臺州 朝陽 大慶 楊凌 果洛 江蘇
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談我是如何用redis做實時訂閱推送的》,本文關(guān)鍵詞 淺談,我是,如,何用,redis,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。