本發(fā)明涉及互聯(lián)網(wǎng)視頻點播領(lǐng)域,具體來講涉及一種視頻訂閱動態(tài)的實現(xiàn)系統(tǒng)及方法。
背景技術(shù):
在視頻點播網(wǎng)站,視頻作者可以上傳視頻給不同的用戶觀看,而用戶也可以通過訂閱自己喜愛的視頻作者,通過訂閱動態(tài),及時查詢到該視頻作者上傳的最新視頻。
當視頻作者上傳新的視頻后,通用的方案是,服務(wù)器來更新訂閱該視頻作者的所有用戶的訂閱動態(tài),用戶通過客戶端定時查詢訂閱動態(tài),以便于及時讓對應(yīng)用戶能夠查詢視頻作者的最新視頻。但是對于大用戶量的視頻點播網(wǎng)站,往往一個視頻作者有幾百甚至更多用戶訂閱,服務(wù)器一一更新每個用戶的訂閱動態(tài),工作量非常大,拖慢了服務(wù)器速度;另外,如果用戶通過客戶端可以定時查詢訂閱動態(tài),服務(wù)器不能滿足定時任務(wù)引發(fā)的QPS(Query Per Second,每秒查詢率)時,則需要進行新的開發(fā)以滿足QPS。
技術(shù)實現(xiàn)要素:
針對現(xiàn)有技術(shù)中存在的缺陷,本發(fā)明的目的在于提供一種視頻訂閱動態(tài)的實現(xiàn)系統(tǒng)及方法,減少更新部分用戶的訂閱狀態(tài),
降低服務(wù)器工作量,提升服務(wù)器速度,通過橫向擴展的形式,直接增加新的服務(wù)器滿足QPS。
為達到以上目的,本發(fā)明采取一種視頻訂閱動態(tài)的實現(xiàn)系統(tǒng),包括:多個客戶端,用于用戶注冊并與訂閱動態(tài)服務(wù)集群通信;一個訂閱動態(tài)服務(wù)集群,包括至少一個服務(wù)單元,服務(wù)單元無狀態(tài),用于記錄視頻作者上傳視頻,以及統(tǒng)計用戶訂閱的視頻作者是否有新動態(tài);一個主遠程字典服務(wù)器,用于寫入并存儲數(shù)據(jù),且不負責持久化;多個從遠程字典服務(wù)器,均用于存儲視頻作者上傳的時間戳以及用戶最后瀏覽訂閱頁面的時間戳,其中一個從遠程字典服務(wù)器負責持久化,不提供查詢;其余從遠程字典服務(wù)器提供查詢,不負責持久化。
本發(fā)明還提供一種視頻訂閱動態(tài)實現(xiàn)方法,包括:視頻作者通過客戶端上傳視頻的視頻請求數(shù)據(jù),其中包括視頻上傳時間戳和視頻作者ID,客戶端將視頻請求數(shù)據(jù)發(fā)送給訂閱動態(tài)服務(wù)集群中的一個服務(wù)單元,該服務(wù)單元驗證視頻請求數(shù)據(jù)有效后,主遠程字典服務(wù)器更新最后的視頻上傳時間戳;當用戶通過客戶端查詢訂閱動態(tài)時,客戶端發(fā)送查詢請求數(shù)據(jù)給訂閱動態(tài)服務(wù)集群中的一個服務(wù)單元,且查詢請求數(shù)據(jù)中包含用戶最后訪問訂閱頁面的訪問時間戳以及用戶訂閱的視頻作者ID列表;服務(wù)單元驗證查詢請求數(shù)據(jù)有效后,選取一個提供查詢的從遠程字典服務(wù)器,遍歷用戶訂閱的每個視頻作者ID,獲取其對應(yīng)的最近的視頻上傳時間戳,如果視頻上傳時間戳大于用戶上一次訪問的訪問時間戳,則表示用戶有訂閱動態(tài),否則無訂閱動態(tài)。
在上述技術(shù)方案的基礎(chǔ)上,所述每個服務(wù)單元都有一個唯一的下標,下標的范圍大于等于0,且小于Sn,其中Sn是訂閱動態(tài)服務(wù)集群中服務(wù)單元的總數(shù),Sn≥1。
在上述技術(shù)方案的基礎(chǔ)上,所述客戶端選取發(fā)送視頻請求數(shù)據(jù)或查詢請求數(shù)據(jù)的服務(wù)單元時,首先調(diào)用隨機函數(shù)獲取一個隨機數(shù)Rn,對隨機數(shù)Rn進行哈希計算獲得數(shù)值Hn,數(shù)值Hn對服務(wù)單元的總數(shù)Sn求余,余數(shù)就是選定服務(wù)單元的下標。
在上述技術(shù)方案的基礎(chǔ)上,所述視頻請求數(shù)據(jù)還包括視頻ID,當視頻請求數(shù)據(jù)中視頻作者ID、視頻ID和視頻上傳時間戳均正確時,服務(wù)單元驗證視頻請求數(shù)據(jù)有效。
在上述技術(shù)方案的基礎(chǔ)上,主遠程字典服務(wù)器使用哈希數(shù)據(jù)結(jié)構(gòu)存儲視頻作者上傳的視頻信息,其中,鍵為視頻作者ID,域為視頻ID,值為視頻上傳時間戳。
在上述技術(shù)方案的基礎(chǔ)上,所述查詢請求數(shù)據(jù)還包括用戶ID,當查詢請求數(shù)據(jù)中用戶ID、訪問時間戳和視頻作者ID列表均正確時,服務(wù)單元驗證查詢請求數(shù)據(jù)有效。
在上述技術(shù)方案的基礎(chǔ)上,每個提供查詢的從遠程字典服務(wù)器都有一個唯一的下標,下標的范圍大于等于1,且小于等于Ay,其中Ay是提供查詢的從遠程字典服務(wù)器總數(shù),Ay≥2。
在上述技術(shù)方案的基礎(chǔ)上,服務(wù)單元選取查詢的從遠程字典服務(wù)器時,調(diào)用隨機函數(shù)獲取一個隨機數(shù)By,對隨機數(shù)By進行哈希計算獲得數(shù)值Cy,數(shù)值Cy對提供查詢的從遠程字典服務(wù)器總數(shù)Ay求余,余數(shù)再加1,得到的結(jié)果就是選定從遠程字典服務(wù)器的下標。
在上述技術(shù)方案的基礎(chǔ)上,所述提供查詢的從遠程字典服務(wù)器中,使用從遠程字典服務(wù)器內(nèi)置的evalsha指令通過lua腳本查詢用戶訂閱動態(tài)。
本發(fā)明的有益效果在于:
1、由于訂閱動態(tài)服務(wù)集群包括多個服務(wù)單元,都是無狀態(tài)服務(wù),是可以無限制橫向擴展;同時,可查詢的從遠程字典服務(wù)器也是可以無限制橫向擴展的,在服務(wù)層和數(shù)據(jù)庫層,均解決了服務(wù)器不能滿足定時任務(wù)引發(fā)的QPS的問題,可以通過直接增加新的服務(wù)器滿足QPS。
2、通過對比視頻作者最后的視頻上傳時間戳和用戶最后的訪問時間戳,來判定用戶是否有新的訂閱狀態(tài),在視頻作者上傳新的視頻后,無需更新每個訂閱了該作者的用戶的訂閱動態(tài),降低服務(wù)器工作量,提升服務(wù)器速度。
3、通過哈希算法和取余的形式計算選取服務(wù)單元的下標,保證高離散性,實現(xiàn)訂閱動態(tài)服務(wù)集群的負載均衡。
4、通過哈希算法和取余的形式選取可查詢的從遠程字典服務(wù)器,保證高離散性,實現(xiàn)多個從遠程字典服務(wù)器的負載均衡。
5、使用evalsha指令通過lua腳本查詢用戶訂閱動態(tài),使原本多次查詢的網(wǎng)絡(luò)交互操作降低為1次網(wǎng)絡(luò)交互操作,大大降低了時間消耗(遠程字典服務(wù)器操作的耗時主要在于網(wǎng)絡(luò)交互)。
使用本方法,在3個從遠程字典服務(wù)器和5個服務(wù)單元的場景下提供10W以上的QPS,毫無壓力的滿足500W在線用戶每2分鐘查詢一次訂閱動態(tài)的需求。
附圖說明
圖1為本發(fā)明實施例視頻訂閱動態(tài)的實現(xiàn)系統(tǒng)示意圖;
圖2為本發(fā)明實施例視頻用戶上傳視頻的流程圖;
圖3為本發(fā)明實施例用戶查詢訂閱狀態(tài)的流程圖。
具體實施方式
以下結(jié)合附圖及實施例對本發(fā)明作進一步詳細說明。
如圖1所示,本發(fā)明視頻訂閱動態(tài)的實現(xiàn)系統(tǒng),包括多個客戶端(Clent)、一個訂閱動態(tài)服務(wù)集群(Subscription Actives Server Cluster)模塊、一個主遠程字典服務(wù)器(Master Remote Dictionary Server)、以及多個從遠程字典服務(wù)器(Slave Remote Dictionary Server)。其中,客戶端用于用戶注冊,并與訂閱動態(tài)服務(wù)集群相互通信。每個訂閱動態(tài)服務(wù)集群包括至少一個服務(wù)單元,服務(wù)單元均為無狀態(tài)單元,用于記錄視頻作者上傳視頻,以及統(tǒng)計用戶訂閱的視頻作者是否有新動態(tài),為了更清楚展示,圖1中繪有多個服務(wù)單元。所述主遠程字典服務(wù)器作為數(shù)據(jù)寫入入口,用于寫入并存儲數(shù)據(jù),且不負責持久化(即把數(shù)據(jù)保存到可永久保存的存儲設(shè)備中)。多個從遠程字典服務(wù)器,均用于存儲視頻作者上傳的時間戳以及用戶最后瀏覽訂閱頁面的時間戳,其中一個從遠程字典服務(wù)器負責持久化,不提供查詢,是為了遠程字典服務(wù)器的服務(wù)崩潰后,恢復數(shù)據(jù)用的;其余從遠程字典服務(wù)器提供查詢,不負責持久化。
本發(fā)明實施例視頻訂閱動態(tài)實現(xiàn)方法,包括:
視頻作者通過客戶端上傳視頻的視頻請求數(shù)據(jù),視頻請求數(shù)據(jù)中包括視頻上傳時間戳和視頻作者ID,客戶端將視頻請求數(shù)據(jù)發(fā)送給訂閱動態(tài)服務(wù)集群中的一個服務(wù)單元,該服務(wù)單元驗證視頻請求數(shù)據(jù)有效后,主遠程字典服務(wù)器更新最后的視頻上傳時間戳;
當用戶通過客戶端查詢訂閱動態(tài)時,客戶端發(fā)送查詢請求數(shù)據(jù)給訂閱動態(tài)服務(wù)集群中的一個服務(wù)單元,且查詢請求數(shù)據(jù)中包含用戶最后訪問訂閱頁面的訪問時間戳以及用戶訂閱的視頻作者ID;
服務(wù)單元驗證查詢請求數(shù)據(jù)有效后,選取一個提供查詢的從遠程字典服務(wù)器,遍歷每一個視頻作者ID,獲取其對應(yīng)的最近的視頻上傳時間戳,如果視頻上傳時間戳大于用戶上一次訪問的訪問時間戳,則表示用戶有訂閱動態(tài),否則無訂閱動態(tài)。
如圖2所示,本發(fā)明實施例中,視頻用戶上傳視頻的流程具體如下:
S101.視頻作者通過客戶端上傳視頻的視頻請求數(shù)據(jù)(UploadData),視頻請求數(shù)據(jù)中包括視頻上傳時間戳(UploadTimestamp)、視頻作者ID(UploaderID)和視頻ID(VideoID),每個視頻作者擁有全局唯一視頻作者ID,每部視頻都有一個全局唯一的64位視頻ID。
S102.客戶端將上傳的視頻請求數(shù)據(jù)發(fā)送給訂閱動態(tài)服務(wù)集群中的一個服務(wù)單元。具體的,每個服務(wù)單元都有一個唯一的下標,下標的范圍為[0,Sn),其中Sn是訂閱動態(tài)服務(wù)集群中服務(wù)單元的總數(shù),且Sn≥1。調(diào)用隨機函數(shù)獲取一個隨機數(shù)Rn,對隨機數(shù)Rn進行哈希計算獲得數(shù)值Hn,數(shù)值Hn對服務(wù)單元的總數(shù)Sn求余,余數(shù)就是選定服務(wù)單元的下標;優(yōu)選的,調(diào)用隨機函數(shù)Random(),對Rn進行BKDR Hash運算。當具有多個服務(wù)單元時,通過求余的方式實現(xiàn)訂閱動態(tài)服務(wù)集群的負載均衡,由于訂閱動態(tài)服務(wù)集群中的服務(wù)單元都是無狀態(tài)服務(wù),可以無限制橫向擴展,在服務(wù)層降低服務(wù)器工作量。
S103.選取的服務(wù)單元驗證視頻請求數(shù)據(jù)中參數(shù)的正確性,即,判斷視頻請求數(shù)據(jù)中視頻作者ID、視頻ID和視頻上傳時間戳是否都正確,若是,進入S104;若否,進入S106。
S104.服務(wù)單元驗證視頻請求數(shù)據(jù)有效,進入S105。
S105.主遠程字典服務(wù)器中,使用哈希數(shù)據(jù)結(jié)構(gòu)存儲視頻作者上傳的視頻信息;其中,鍵(Key)為視頻作者ID(uploader),域(filed)為視頻ID,值(value)為視頻上傳時間戳,視頻上傳結(jié)束。
S106.驗證視頻請求數(shù)據(jù)無效,上傳視頻失敗,結(jié)束。
如圖3所示,本發(fā)明實施例中,用戶查詢訂閱狀態(tài)的具體流程如下:
S201.用戶通過客戶端發(fā)送查詢請求數(shù)據(jù)(QueryData),查詢訂閱動態(tài);查詢請求數(shù)據(jù)中包含用戶ID(UID)、用戶最后訪問訂閱頁面的訪問時間戳(QueryTimestamp)以及用戶訂閱的視頻作者ID列表(UploaderIDList)。
S202.客戶端將查詢請求數(shù)據(jù)發(fā)送給訂閱動態(tài)服務(wù)集群中的一個服務(wù)單元。具體的,每個服務(wù)單元都有一個唯一的下標,下標的范圍為[0,Sn),其中Sn是訂閱動態(tài)服務(wù)集群中服務(wù)單元的總數(shù),且Sn≥1。調(diào)用隨機函數(shù)獲取一個隨機數(shù)Rn,對隨機數(shù)Rn進行哈希計算獲得數(shù)值Hn,數(shù)值Hn對服務(wù)單元的總數(shù)Sn求余,余數(shù)就是選定服務(wù)單元的下標,即,服務(wù)單元的下標=Hn%Sn;優(yōu)選的,調(diào)用隨機函數(shù)Random(),對Rn進行BKDR Hash運算。
S203.選取的服務(wù)單元解析查詢請求數(shù)據(jù)的合法性,判斷是否包含正確的用戶ID、訪問時間戳以及視頻作者ID列表,若是,進入S205;若否,進入S204。
S204.查詢請求數(shù)據(jù)不合法,結(jié)束。
S205.服務(wù)單元選擇一個提供查詢的從遠程字典服務(wù)器,查詢用戶是否有訂閱動態(tài)。具體的,每個提供查詢的從遠程字典服務(wù)器都有一個唯一的下標,下標的范圍是[1,Ay],其中Ay是提供查詢的從遠程字典服務(wù)器總數(shù),且Ay≥2。服務(wù)單元選取查詢的從遠程字典服務(wù)器,調(diào)用隨機函數(shù)獲取一個隨機數(shù)By,對隨機數(shù)By進行哈希計算獲得數(shù)值Cy,數(shù)值Cy對提供查詢的從遠程字典服務(wù)器總數(shù)Ay求余,余數(shù)再加1,得到的就是選定從遠程字典服務(wù)器的下標,即,從遠程字典服務(wù)器的下標=(Cy%Ay)+1。優(yōu)選的,調(diào)用隨機函數(shù)Random()獲取隨機數(shù)By,對By進行BKDR Hash獲得數(shù)值Cy。提供查詢的從遠程字典服務(wù)器可以無限制增加,在數(shù)據(jù)庫層面去掉了服務(wù)器不能滿足QPS的瓶頸。本實施例中,不提供查詢的從遠程字典服務(wù)器下標為0。
S206.遍歷用戶訂閱的每個視頻作者ID,獲取其對應(yīng)的最近的視頻上傳時間戳,判斷視頻上傳時間戳是否大于用戶上一次訪問的述訪問時間戳,若是,進入S207;若否,進入S208。
S207.視頻上傳時間戳大于用戶的所述訪問時間戳,則表示用戶有訂閱動態(tài),跳出遍歷循環(huán),結(jié)束。
S208.如果遍歷結(jié)束還未找到比用戶上一次訪問時間戳大的視頻上傳時間戳,則表示無訂閱動態(tài),結(jié)束。
優(yōu)選的,使用從遠程字典服務(wù)器內(nèi)置的evalsha(eval和evalsha命令是從Redis 2.6.0版本開始的,使用內(nèi)置的Lua解釋器,可以對Lua腳本進行求值)指令查詢用戶的訂閱動態(tài),指令參數(shù)為查詢請求數(shù)據(jù)。使用evalsha指令通過lua腳本查詢用戶訂閱動態(tài),使原本多次查詢的網(wǎng)絡(luò)交互操作降低為1次網(wǎng)絡(luò)交互,大大降低了時間消耗(遠程字典服務(wù)器操作的耗時主要在于網(wǎng)絡(luò)交互)。通過對比最后的視頻上傳視頻時間戳和用戶的訪問時間戳的方法,來判定用戶是否有新的訂閱動態(tài)。如此,無需在視頻作者上傳新視頻后,去更新每個訂閱了該視頻作者的用戶的訂閱動態(tài)。
本發(fā)明不局限于上述實施方式,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也視為本發(fā)明的保護范圍之內(nèi)。本說明書中未作詳細描述的內(nèi)容屬于本領(lǐng)域?qū)I(yè)技術(shù)人員公知的現(xiàn)有技術(shù)。