本申請涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,尤其是涉及一種憑證數(shù)據(jù)發(fā)放方法、裝置及系統(tǒng)。
背景技術(shù):
當(dāng)前諸如電子優(yōu)惠券(其是由各商家發(fā)放,以各種電子媒介形式制作、傳播和使用的促銷優(yōu)惠憑證)這類憑證常是由系統(tǒng)以電子媒介的形式(包括互聯(lián)網(wǎng)、移動網(wǎng)絡(luò)、短信和彩信)下發(fā)給用戶的。當(dāng)收到用戶的索取憑證申請后,系統(tǒng)會自動將憑證發(fā)放給該用戶,并將該憑證的狀態(tài)更新為已下發(fā)。
然而,但是在遇到高并發(fā)的情況下,在某個時刻tps(transactionpersecond,每秒事務(wù)處理量)會非常高。比如一些秒殺類型的網(wǎng)絡(luò)活動,往往很多用戶可能會同時選到了同一個憑證,并試圖去加鎖以更新這個憑證為己使用,從而引來很高的鎖等待或者超時報錯,此時,憑證發(fā)放的失敗率一般會較大。因此,如何有序的分配憑證,以降低在超高并發(fā)訪問下的憑證發(fā)放失敗率。
技術(shù)實現(xiàn)要素:
本申請實施例的目的在于提供一種憑證數(shù)據(jù)發(fā)放方法、裝置及系統(tǒng),以有序的分配憑證,降低其在超高并發(fā)訪問下的發(fā)放失敗率。
為達(dá)到上述目的,一方面,本申請實施例提供了一種憑證數(shù)據(jù)發(fā)放方法,包括以下步驟:
獲取憑證訪問請求;
從多個憑證組標(biāo)識中確定一個當(dāng)前未被鎖定的憑證組標(biāo)識;
判斷所述當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)是否有未發(fā)放的憑證;
如果有未發(fā)放的憑證,則將所述當(dāng)前未被鎖定的憑證組標(biāo)識的狀態(tài)更新為鎖定狀態(tài);
將所述未發(fā)放的憑證加載至緩存隊列;
將所述緩存隊列內(nèi)的指定憑證發(fā)放給所述憑證訪問請求所對應(yīng)的用戶,并將所述指定憑證的狀態(tài)更新為已發(fā)放。
另一方面,本申請實施例還提供了一種憑證數(shù)據(jù)發(fā)放裝置,包括:
訪問請求獲取單元,用于獲取憑證訪問請求;
憑證組標(biāo)識鎖定單元,用于從多個憑證組標(biāo)識中確定一個當(dāng)前未被鎖定的憑證組標(biāo)識;
憑證組標(biāo)識更新單元,用于判斷所述當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)是否有未發(fā)放的憑證;如果有未發(fā)放的憑證,則將所述當(dāng)前未被鎖定的憑證組標(biāo)識的狀態(tài)更新為鎖定狀態(tài);
憑證加載單元,用于將所述未發(fā)放的憑證加載至緩存隊列;
憑證發(fā)放單元,用于將所述緩存隊列內(nèi)的指定憑證發(fā)放給所述憑證訪問請求所對應(yīng)的用戶,并將所述指定憑證的狀態(tài)更新為已發(fā)放。
再一方面,本申請實施例還提供了一種憑證數(shù)據(jù)發(fā)放系統(tǒng),其包括上述的憑證數(shù)據(jù)發(fā)放裝置。
本申請實施例的憑證數(shù)據(jù)發(fā)放方案中,所有待發(fā)放的憑證被預(yù)先劃分成若干個憑證組存儲于數(shù)據(jù)庫中,其中每個憑證組對應(yīng)有一個憑證組標(biāo)識,在獲取憑證訪問請求后,查詢憑證組標(biāo)識的當(dāng)前狀態(tài),如果查詢到當(dāng)前憑證組標(biāo)識的狀態(tài)為未鎖定狀態(tài),則選擇該當(dāng)前未被鎖定的憑證組標(biāo)識;并進(jìn)一步判斷當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)是否有未發(fā)放的憑證;如果有,則將當(dāng)前未被鎖定的憑證組標(biāo)識的狀態(tài)更新為鎖定狀態(tài),然后將該憑證組標(biāo)識對應(yīng)的憑證組的內(nèi)憑證組加載入緩存隊列以供發(fā)放。由一旦憑證組標(biāo)識被鎖定,在鎖定狀態(tài)下,其對應(yīng)憑證組內(nèi)所有未發(fā)放的憑證只能被鎖定該憑證組標(biāo)識的那個服務(wù)器使用,因此,即使在高并發(fā)訪問的情況下,同一個憑證組標(biāo)識下的所有未發(fā)放的憑證也不可能有其他服務(wù)器競爭,因此,本申請實施例極大的降低了憑證發(fā)放失敗的概率。
附圖說明
此處所說明的附圖用來提供對本申請實施例的進(jìn)一步理解,構(gòu)成本申請實施例的一部分,并不構(gòu)成對本申請實施例的限定。在附圖中:
圖1為本申請實施例的憑證數(shù)據(jù)發(fā)放方法的流程圖;
圖2為本申請實施例的憑證數(shù)據(jù)發(fā)放裝置的結(jié)構(gòu)框圖。
具體實施方式
為使本申請實施例的目的、技術(shù)方案和優(yōu)點更加清楚明白,下面結(jié)合實施例和附圖,對本申請實施例做進(jìn)一步詳細(xì)說明。在此,本申請實施例的示意性實施例及其說明用于解釋本申請實施例,但并不作為對本申請實施例的限定。
下面結(jié)合附圖,對本申請實施例的具體實施方式作進(jìn)一步的詳細(xì)說明。
參考圖1所示,本申請實施例的憑證數(shù)據(jù)發(fā)放方法包括以下步驟:
步驟s101,獲取憑證訪問請求。在本申請的一個實施例中,憑證訪問請求可以是用戶通過pc終端、移動終端(比如智能手機、筆記本電腦、平板電腦等)、自助服務(wù)終端等終端在線發(fā)起的,在本申請的另一個實施例中,憑證訪問請求也可以是用戶通過安裝于這些終端上的客戶端發(fā)起的。
步驟s102,從多個憑證組標(biāo)識中確定一個當(dāng)前未被鎖定的憑證組標(biāo)識。
本申請實施例中,所有待發(fā)放的憑證被預(yù)先劃分成若干個憑證組存儲于數(shù)據(jù)庫中,其中每個憑證組對應(yīng)有一個憑證組標(biāo)識。在獲取憑證訪問請求后,查詢憑證組標(biāo)識的當(dāng)前狀態(tài),如果查詢到當(dāng)前憑證組標(biāo)識的狀態(tài)為未鎖定狀態(tài),則選擇該當(dāng)前未被鎖定的憑證組標(biāo)識;而如果查詢到當(dāng)前憑證組標(biāo)識的狀態(tài)為鎖定狀態(tài),則繼續(xù)查詢下一個憑證組標(biāo)識的狀態(tài)并進(jìn)行類似的判斷,以選擇出一個當(dāng)前未被鎖定的憑證組標(biāo)識。
步驟s103,判斷所述當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)是否有未發(fā)放的憑證。如果有,則執(zhí)行步驟s104。本步驟中,通過查詢當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)的憑證的狀態(tài)可以獲知當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)是否有未發(fā)放的憑證。
步驟s104,將所述當(dāng)前未被鎖定的憑證組標(biāo)識的狀態(tài)更新為鎖定狀態(tài)。一旦憑證組標(biāo)識被鎖定,集群中的其他服務(wù)器均不能選定該憑證組標(biāo)識,除非該憑證組標(biāo)識狀態(tài)發(fā)生變化,即被更新為未鎖定狀態(tài),以防止出現(xiàn)憑證組標(biāo)識選擇沖突。
步驟s105,將所述未發(fā)放的憑證加載至緩存隊列。一般的,將所述當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)所有未發(fā)放的憑證全部加載入緩存隊列。
步驟s106,將所述緩存隊列內(nèi)的指定憑證發(fā)放給所述憑證訪問請求所對應(yīng)的用 戶,并將所述指定憑證的狀態(tài)更新為已發(fā)放。一般的,憑證發(fā)放可以是針對一個請求發(fā)放一個憑證,所述的指定憑證,一般為緩存隊列內(nèi)的第一個憑證,當(dāng)然,根據(jù)需要也可以是一個請求發(fā)放多個憑證,比如針對一請求發(fā)放5個憑證,則此時指定憑證則可以為緩存隊列內(nèi)的前5個憑證。在本申請實施例中,每個憑證組內(nèi)的憑證一旦被發(fā)放,該憑證的狀態(tài)就會被更新為已發(fā)放狀態(tài),以防止已發(fā)放的憑證后續(xù)被重復(fù)發(fā)放。
在步驟s103之后,本申請實施例的憑證數(shù)據(jù)發(fā)放方法還可以包括步驟s107:如果所述當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)沒有未發(fā)放的憑證,則將所述當(dāng)前未被鎖定的憑證組標(biāo)識的狀態(tài)更新為不可用狀態(tài),然后跳轉(zhuǎn)執(zhí)行步驟s102。而一旦當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)沒有未發(fā)放的憑證,則說明該憑證組標(biāo)識對應(yīng)的憑證組內(nèi)的憑證已全部發(fā)放,因此,該憑證組標(biāo)識應(yīng)狀態(tài)更新為不可用狀態(tài),以免其被再次選擇而浪費系統(tǒng)資源。
在本申請另一實施例中,在所述將未發(fā)放的憑證加載至緩存隊列之后,本申請實施例的憑證數(shù)據(jù)發(fā)放方法還可以包括一個憑證過期回收機制,其包括以下步驟:
判斷當(dāng)前所述緩存隊列是否超出預(yù)設(shè)的緩存更新時間;所述判斷當(dāng)前所述緩存隊列是否超出預(yù)設(shè)的緩存更新時間,具體可以依據(jù)當(dāng)前所述緩存隊列中第一個憑證的加載入隊時間(加載入隊時,每個憑證都有一個加載入隊時間)判斷該緩存隊列是否超出預(yù)設(shè)的緩存更新時間;如果超出,則清空所述緩存隊列,并將該緩存隊列中的每個憑證所對應(yīng)的憑證組標(biāo)識的狀態(tài)更新為未鎖定狀態(tài)。
在本申請一實施例中,上述的鎖定狀態(tài)包括鎖定時間;對應(yīng)的,如果當(dāng)前所述緩存隊列未超出預(yù)設(shè)的緩存更新時間,則將當(dāng)前所述緩存隊列內(nèi)每個憑證所對應(yīng)的憑證組標(biāo)識的鎖定時間更新為當(dāng)前時間。這里更新為當(dāng)前時間,是指集群中某臺處理器,在維護(hù)本地的憑證緩存隊列共業(yè)務(wù)調(diào)用消耗的過程中,如果憑證緩存隊列的數(shù)量較低的時候,就需要預(yù)加載一批憑證上來以防止本地緩存隊列馬上就要為空從而導(dǎo)致業(yè)務(wù)失敗的情況,那么這臺處理器就需要去查詢一個可用的憑證組,確定其可用的前提下,先更新數(shù)據(jù)庫狀態(tài),在這條憑證組記錄上機器名和時間,這樣,則其他處理器則不可再使用這批憑證,保證憑證使用時候的唯一性。
上述憑證過期回收機制目的是為了防止單個服務(wù)器加載憑證后由于自身宕機或者集群出現(xiàn)了負(fù)載不均而導(dǎo)致的憑證無消耗或消耗中斷(這里的無消耗是指沒有下發(fā)憑證,消耗中斷是指憑證下發(fā)處理中途中止),因此,需要在一段時間后強制從宕機 或有問題的服務(wù)器上對加載的憑證進(jìn)行放回數(shù)據(jù)庫的操作,以保證集群中其他有能力的服務(wù)器可以及時獲取到寶貴資源。
在本申請另一實施例中,本申請實施例的憑證數(shù)據(jù)發(fā)放方法還可以包括:
當(dāng)所述緩存隊列內(nèi)的憑證個數(shù)低于設(shè)定值時,異步加載一個新的當(dāng)前未被鎖定的憑證組標(biāo)識至所述緩存隊列,以提高憑證發(fā)放效率,防止出現(xiàn)緩存隊列中無憑證可發(fā)放而導(dǎo)致服務(wù)器空閑等待。
在本申請另一實施例中,本申請實施例的憑證數(shù)據(jù)發(fā)放方法還可以包括:
在多憑證發(fā)放線程環(huán)境下,當(dāng)同時有多個緩存隊列內(nèi)的憑證個數(shù)低于設(shè)定值時,同時只有一個憑證發(fā)放線程進(jìn)行異步加載。多線程下,只允許一個線程進(jìn)行異步加載的目的是為了保證緩存隊列的長度不會太長。
在本申請實施例中,所述憑證組標(biāo)識包括所述憑證組標(biāo)識所對應(yīng)憑證組的分表分組位,所述分表分組位表示所述憑證組標(biāo)識對應(yīng)的憑證組所屬的憑證數(shù)據(jù)表的標(biāo)識及其在該憑證數(shù)據(jù)表中所屬的分組的標(biāo)識,因此,該分表分組位在作為憑證組識別標(biāo)識的同時,還兼作為路由查詢位置,從而有利于提高系統(tǒng)的憑證發(fā)放處理效率。
在本申請實施例中,各個憑證組可預(yù)先根據(jù)憑證組標(biāo)識存入數(shù)據(jù)庫(db),而每個所述憑證組標(biāo)識可預(yù)先通過以下方式獲得:
獲取一個待處理的憑證;
將所述待處理的憑證的特征信息進(jìn)行哈希運算(hash),獲取特征映射值;其中,所述憑證的特征信息包括:憑證標(biāo)識和/或憑證密碼;其中,憑證標(biāo)識例如可以是憑證卡號。
取所述特征映射值的絕對值,并將該絕對值對預(yù)設(shè)的憑證數(shù)據(jù)表數(shù)量進(jìn)行取模,獲得所述待處理的憑證所屬的分表位;
根據(jù)函數(shù)y=α/β*γ+1,獲取單個憑證數(shù)據(jù)表的分組上限y,其中,α為預(yù)設(shè)的憑證總數(shù)量,β為預(yù)設(shè)的憑證數(shù)據(jù)表數(shù)量,γ為預(yù)設(shè)的單個憑證組內(nèi)的憑證上限;
取所述單個憑證數(shù)據(jù)表的分組上限y內(nèi)的隨機數(shù)作為所述待處理的憑證所屬憑證組在對應(yīng)分表位內(nèi)的分組標(biāo)識。
比如當(dāng)前有1億個憑證需存入數(shù)據(jù)庫,假設(shè)當(dāng)前一個憑證的卡號為qser1342ert,則對該值先做hash,然后取絕對值,再將獲得的絕對值對預(yù)設(shè)的分表個數(shù)1000進(jìn)行取模,假設(shè)可得到的分表位為984。假設(shè)根據(jù)上述公式計算得到 的單個憑證數(shù)據(jù)表的分組上限為1000,并且當(dāng)前取到的該單個憑證數(shù)據(jù)表的分組上限內(nèi)的隨機數(shù)為999,則該憑證所述的憑證組的憑證組標(biāo)識即為984_999,其代表該憑證所屬的憑證組在第984表的第999個分組中。
通過上述方式獲得的憑證組標(biāo)識可以有利于將這些憑證組均勻的寫入到數(shù)據(jù)庫的分表分組中存儲,以防止產(chǎn)生數(shù)據(jù)傾斜。此外,由于既要保障系統(tǒng)盡量高效的運行,又盡量小的產(chǎn)生碎片,必須給單個憑證組內(nèi)的憑證上限設(shè)定一個合理的值。比如一集群處理請求的能力是10萬個/秒,該集群有1000臺服務(wù)器,則每臺服務(wù)器每秒需要處理10萬/1000=100個請求。如果1秒加載10個請求進(jìn)一臺服務(wù)器,則1秒中內(nèi)僅會有10次請求i/o到數(shù)據(jù)庫進(jìn)行加載,效率較低,而如果我們1秒加載1000個請求一臺進(jìn)服務(wù)器,雖然數(shù)據(jù)庫的加載性能提高了,但是該臺服務(wù)器的瞬間內(nèi)存消耗較高,從而容易出現(xiàn)故障(比如宕機)。而一旦服務(wù)器宕機,或者集群的處理負(fù)載不均,或者業(yè)務(wù)流量突然進(jìn)入低谷,則可能會導(dǎo)致大量的憑證積壓在集群中的一臺或多臺服務(wù)器上無法發(fā)放,而集群中其他正常的服務(wù)器這個時候即使加載了請求也有可能因為沒有憑證可加載而導(dǎo)致業(yè)務(wù)處理失敗。因此,單個憑證組內(nèi)的憑證上限應(yīng)該盡量的與集群的處理能力相匹配。
此外,基于上述憑證組標(biāo)識獲得方式,在每個憑證進(jìn)行入庫存儲時,當(dāng)生成憑證組標(biāo)識后,要先查詢數(shù)據(jù)庫中是否以存在相同的憑證組標(biāo)識,如果不存在,則先將新生成的憑證組標(biāo)識寫入,再將該憑證對應(yīng)寫入;而如果已存在相同的憑證組標(biāo)識,則直接將該憑證對應(yīng)寫入即可。
雖然上文描述的過程流程包括以特定順序出現(xiàn)的多個操作,但是,應(yīng)當(dāng)清楚了解,這些過程可以包括更多或更少的操作,這些操作可以順序執(zhí)行或并行執(zhí)行(例如使用并行處理器或多線程環(huán)境)。
本申請實施例的憑證數(shù)據(jù)發(fā)放方法中,所有待發(fā)放的憑證被預(yù)先劃分成若干個憑證組存儲于數(shù)據(jù)庫中,其中每個憑證組對應(yīng)有一個憑證組標(biāo)識,在獲取憑證訪問請求后,查詢憑證組標(biāo)識的當(dāng)前狀態(tài),如果查詢到當(dāng)前憑證組標(biāo)識的狀態(tài)為未鎖定狀態(tài),則選擇該當(dāng)前未被鎖定的憑證組標(biāo)識;并進(jìn)一步判斷當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)是否有未發(fā)放的憑證;如果有,則將當(dāng)前未被鎖定的憑證組標(biāo)識的狀態(tài)更新為鎖定狀態(tài),然后將該憑證組標(biāo)識對應(yīng)的憑證組的內(nèi)憑證組加載入緩存隊列以供發(fā)放。由一旦憑證組標(biāo)識被鎖定,在鎖定狀態(tài)下,其對應(yīng)憑證組內(nèi)所有未發(fā)放的憑證只 能被鎖定該憑證組標(biāo)識的那個服務(wù)器使用,因此,即使在高并發(fā)訪問的情況下,同一個憑證組標(biāo)識下的所有未發(fā)放的憑證也不可能有其他服務(wù)器競爭,因此,本申請實施例極大的降低了憑證發(fā)放失敗的概率。此外,由于本申請實施例的憑證數(shù)據(jù)發(fā)放方法還設(shè)置有憑證過期回收機制,該憑證過期回收機制可在設(shè)定時間達(dá)到后強制有問題的服務(wù)器上對加載的憑證進(jìn)行放回數(shù)據(jù)庫的操作,以保證集群中其他有能力的服務(wù)器可以及時獲取到寶貴資源,從而進(jìn)一步降低了憑證發(fā)放失敗的概率。
本申請實施例的憑證數(shù)據(jù)發(fā)放系統(tǒng)包括憑證數(shù)據(jù)發(fā)放裝置,結(jié)合圖2所示,該憑證數(shù)據(jù)發(fā)放裝置包括:
訪問請求獲取單元21,用于獲取憑證訪問請求。在本申請的一個實施例中,憑證訪問請求可以是用戶通過pc終端、移動終端(比如智能手機、筆記本電腦、平板電腦等)、自助服務(wù)終端等終端在線發(fā)起的,在本申請的另一個實施例中,憑證訪問請求也可以是用戶通過安裝于這些終端上的客戶端發(fā)起的。
憑證組標(biāo)識鎖定單元22,用于從多個憑證組標(biāo)識中確定一個當(dāng)前未被鎖定的憑證組標(biāo)識。本申請實施例中,所有待發(fā)放的憑證被預(yù)先劃分成若干個憑證組存儲于數(shù)據(jù)庫中,其中每個憑證組對應(yīng)有一個憑證組標(biāo)識。在訪問請求獲取單元21獲取憑證訪問請求后,憑證組標(biāo)識鎖定單元22查詢憑證組標(biāo)識的當(dāng)前狀態(tài),如果查詢到當(dāng)前憑證組標(biāo)識的狀態(tài)為未鎖定狀態(tài),則選擇該當(dāng)前未被鎖定的憑證組標(biāo)識;而如果查詢到當(dāng)前憑證組標(biāo)識的狀態(tài)為鎖定狀態(tài),則繼續(xù)查詢下一個憑證組標(biāo)識的狀態(tài)并進(jìn)行類似的判斷,以選擇出一個當(dāng)前未被鎖定的憑證組標(biāo)識。
憑證組標(biāo)識更新單元23,用于判斷所述當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)是否有未發(fā)放的憑證;如果有未發(fā)放的憑證,則將所述當(dāng)前未被鎖定的憑證組標(biāo)識的狀態(tài)更新為鎖定狀態(tài)。通過查詢當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)的憑證的狀態(tài)可以獲知當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)是否有未發(fā)放的憑證。一旦憑證組標(biāo)識被鎖定,集群中的其他服務(wù)器均不能選定該憑證組標(biāo)識,除非該憑證組標(biāo)識狀態(tài)發(fā)生變化,即被更新為未鎖定狀態(tài),以防止出現(xiàn)憑證組標(biāo)識選擇沖突。
憑證加載單元24,用于將所述未發(fā)放的憑證加載至緩存隊列。一般的,將所述當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)所有未發(fā)放的憑證全部加載入緩存隊列。
憑證發(fā)放單元25,用于將所述緩存隊列內(nèi)的指定憑證發(fā)放給所述憑證訪問請求所對應(yīng)的用戶,并將所述指定憑證的狀態(tài)更新為已發(fā)放。一般的,憑證發(fā)放可以是針 對一個請求發(fā)放一個憑證,所述的指定憑證,一般為緩存隊列內(nèi)的第一個憑證,當(dāng)然,根據(jù)需要也可以是一個請求發(fā)放多個憑證,比如針對一請求發(fā)放5個憑證,則此時指定憑證則可以為緩存隊列內(nèi)的前5個憑證。在本申請實施例中,每個憑證組內(nèi)的憑證一旦被發(fā)放,該憑證的狀態(tài)就會被更新為已發(fā)放狀態(tài),以防止已發(fā)放的憑證后續(xù)被重復(fù)發(fā)放。
在本申請另一實施例中,所述憑證組標(biāo)識更新單元還可以用于當(dāng)所述當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)沒有未發(fā)放的憑證,則將所述當(dāng)前未被鎖定的憑證組標(biāo)識的狀態(tài)更新為不可用狀態(tài)。而一旦當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)沒有未發(fā)放的憑證,則說明該憑證組標(biāo)識對應(yīng)的憑證組內(nèi)的憑證已全部發(fā)放,因此,該憑證組標(biāo)識應(yīng)狀態(tài)更新為不可用狀態(tài),以免其被再次選擇而浪費系統(tǒng)資源。
在本申請另一實施例中,為了防止單個服務(wù)器加載憑證后由于自身宕機或者集群出現(xiàn)了負(fù)載不均而導(dǎo)致的憑證無消耗或消耗中斷(這里的無消耗是指沒有下發(fā)憑證,消耗中斷是指憑證下發(fā)處理中途中止),因此,需要在一段時間后強制從宕機或有問題的服務(wù)器上對加載的憑證進(jìn)行放回數(shù)據(jù)庫的操作,以保證集群中其他有能力的服務(wù)器可以及時獲取到寶貴資源。所述憑證組標(biāo)識更新單元還用于在所述將所述未發(fā)放的憑證加載至緩存隊列之后,判斷當(dāng)前所述緩存隊列是否超出預(yù)設(shè)的緩存更新時間;如果超出,則清空所述緩存隊列,并將該緩存隊列中的每個憑證所對應(yīng)的憑證組標(biāo)識的狀態(tài)更新為未鎖定狀態(tài)。
在本申請另一實施例中,所述憑證組標(biāo)識更新單元判斷當(dāng)前所述緩存隊列是否超出預(yù)設(shè)的緩存更新時間,包括:
所述憑證組標(biāo)識更新單元依據(jù)當(dāng)前所述緩存隊列中第一個憑證的加載入隊時間(加載入隊時,每個憑證都有一個加載入隊時間)判斷該緩存隊列是否超出預(yù)設(shè)的緩存更新時間。
在本申請另一實施例中,所述鎖定狀態(tài)包括鎖定時間;
對應(yīng)的,如果當(dāng)前所述緩存隊列未超出預(yù)設(shè)的緩存更新時間,則所述憑證組標(biāo)識更新單元可將當(dāng)前所述緩存隊列內(nèi)每個憑證所對應(yīng)的憑證組標(biāo)識的鎖定時間更新為當(dāng)前時間。這里更新為當(dāng)前時間,是指集群中某臺處理器,在維護(hù)本地的憑證緩存隊列共業(yè)務(wù)調(diào)用消耗的過程中,如果憑證緩存隊列的數(shù)量較低的時候,就需要預(yù)加載一批憑證上來以防止本地緩存隊列馬上就要為空從而導(dǎo)致業(yè)務(wù)失敗的情況,那么這臺處 理器就需要去查詢一個可用的憑證組,確定其可用的前提下,先更新數(shù)據(jù)庫狀態(tài),在這條憑證組記錄上機器名和時間,這樣,則其他處理器則不可再使用這批憑證,保證憑證使用時候的唯一性。
在本申請另一實施例中,所述憑證加載單元還用于當(dāng)所述緩存隊列內(nèi)的憑證個數(shù)低于設(shè)定值時,異步加載一個新的當(dāng)前未被鎖定的憑證組標(biāo)識至所述緩存隊列,以提高憑證發(fā)放效率,防止出現(xiàn)緩存隊列中無憑證可發(fā)放而導(dǎo)致服務(wù)器空閑等待。
在本申請另一實施例中,在多憑證發(fā)放線程環(huán)境下,當(dāng)同時有多個緩存隊列內(nèi)的憑證個數(shù)低于設(shè)定值時,所述憑證加載單元同時只對一個憑證發(fā)放線程進(jìn)行異步加載。多線程下,只允許一個線程進(jìn)行異步加載的目的是為了保證緩存隊列的長度不會太長。
在本申請另一實施例中,所述憑證組標(biāo)識包括所述憑證組標(biāo)識所對應(yīng)憑證組的分表分組位,所述分表分組位表示所述憑證組標(biāo)識對應(yīng)的憑證組所屬的憑證數(shù)據(jù)表的標(biāo)識及其在該憑證數(shù)據(jù)表中所屬的分組的標(biāo)識。因此,該分表分組位在作為憑證組識別標(biāo)識的同時,還兼作為路由查詢位置,從而有利于提高系統(tǒng)的憑證發(fā)放處理效率。
在本申請實施例中,各個憑證組可預(yù)先根據(jù)憑證組標(biāo)識存入數(shù)據(jù)庫(db),而每個所述憑證組標(biāo)識可預(yù)先通過以下方式獲得:
獲取一個待處理的憑證;
將所述待處理的憑證的特征信息進(jìn)行哈希運算(hash),獲取特征映射值;其中,所述憑證的特征信息包括:憑證標(biāo)識和/或憑證密碼;其中,憑證標(biāo)識例如可以是憑證卡號。
取所述特征映射值的絕對值,并將該絕對值對預(yù)設(shè)的憑證數(shù)據(jù)表數(shù)量進(jìn)行取模,獲得所述待處理的憑證所屬的分表位;
根據(jù)函數(shù)y=α/β*γ+1,獲取單個憑證數(shù)據(jù)表的分組上限y,其中,α為預(yù)設(shè)的憑證總數(shù)量,β為預(yù)設(shè)的憑證數(shù)據(jù)表數(shù)量,γ為預(yù)設(shè)的單個憑證組內(nèi)的憑證上限;
取所述單個憑證數(shù)據(jù)表的分組上限y內(nèi)的隨機數(shù)作為所述待處理的憑證所屬憑證組在對應(yīng)分表位內(nèi)的分組標(biāo)識。
比如當(dāng)前有1億個憑證需存入數(shù)據(jù)庫,假設(shè)當(dāng)前一個憑證的卡號為qser1342ert,則對該值先做hash,然后取絕對值,再將獲得的絕對值對預(yù)設(shè)的分表個數(shù)1000進(jìn)行取模,假設(shè)可得到的分表位為984。假設(shè)根據(jù)上述公式計算得到 的單個憑證數(shù)據(jù)表的分組上限為1000,并且當(dāng)前取到的該單個憑證數(shù)據(jù)表的分組上限內(nèi)的隨機數(shù)為999,則該憑證所述的憑證組的憑證組標(biāo)識即為984_999,其代表該憑證所屬的憑證組在第984表的第999個分組中。
通過上述方式獲得的憑證組標(biāo)識可以有利于將這些憑證組均勻的寫入到數(shù)據(jù)庫的分表分組中存儲,以防止產(chǎn)生數(shù)據(jù)傾斜。此外,由于既要保障系統(tǒng)盡量高效的運行,又盡量小的產(chǎn)生碎片,必須給單個憑證組內(nèi)的憑證上限設(shè)定一個合理的值。比如一集群處理請求的能力是10萬個/秒,該集群有1000臺服務(wù)器,則每臺服務(wù)器每秒需要處理10萬/1000=100個請求。如果1秒加載10個請求進(jìn)一臺服務(wù)器,則1秒中內(nèi)僅會有10次請求i/o到數(shù)據(jù)庫進(jìn)行加載,效率較低,而如果我們1秒加載1000個請求一臺進(jìn)服務(wù)器,雖然數(shù)據(jù)庫的加載性能提高了,但是該臺服務(wù)器的瞬間內(nèi)存消耗較高,從而容易出現(xiàn)故障(比如宕機)。而一旦服務(wù)器宕機,或者集群的處理負(fù)載不均,或者業(yè)務(wù)流量突然進(jìn)入低谷,則可能會導(dǎo)致大量的憑證積壓在集群中的一臺或多臺服務(wù)器上無法發(fā)放,而集群中其他正常的服務(wù)器這個時候即使加載了請求也有可能因為沒有憑證可加載而導(dǎo)致業(yè)務(wù)處理失敗。所以單個憑證組內(nèi)的憑證上限應(yīng)該盡量的與集群的處理能力相匹配。
此外,基于上述憑證組標(biāo)識獲得方式,在每個憑證進(jìn)行入庫存儲時,當(dāng)生成憑證組標(biāo)識后,要先查詢數(shù)據(jù)庫中是否以存在相同的憑證組標(biāo)識,如果不存在,則先將新生成的憑證組標(biāo)識寫入,再將該憑證對應(yīng)寫入;而如果已存在相同的憑證組標(biāo)識,則直接將該憑證對應(yīng)寫入即可。
本申請實施例的憑證數(shù)據(jù)發(fā)放裝置中,所有待發(fā)放的憑證被預(yù)先劃分成若干個憑證組存儲于數(shù)據(jù)庫中,其中每個憑證組對應(yīng)有一個憑證組標(biāo)識,在訪問請求獲取單元獲取憑證訪問請求后,憑證組標(biāo)識鎖定單元查詢憑證組標(biāo)識的當(dāng)前狀態(tài),如果查詢到當(dāng)前憑證組標(biāo)識的狀態(tài)為未鎖定狀態(tài),則選擇該當(dāng)前未被鎖定的憑證組標(biāo)識;憑證組標(biāo)識更新單元判斷當(dāng)前未被鎖定的憑證組標(biāo)識對應(yīng)的憑證組內(nèi)是否有未發(fā)放的憑證;如果有,則將當(dāng)前未被鎖定的憑證組標(biāo)識的狀態(tài)更新為鎖定狀態(tài),然后憑證加載單元將該憑證組標(biāo)識對應(yīng)的憑證組的內(nèi)憑證組加載入緩存隊列以供憑證發(fā)放單元發(fā)放。由一旦憑證組標(biāo)識被鎖定,在鎖定狀態(tài)下,其對應(yīng)憑證組內(nèi)所有未發(fā)放的憑證只能被鎖定該憑證組標(biāo)識的那個服務(wù)器使用,因此,即使在高并發(fā)訪問的情況下,同一個憑證組標(biāo)識下的所有未發(fā)放的憑證也不可能有其他服務(wù)器競爭,因此,本申請實施例極大 的降低了憑證發(fā)放失敗的概率。此外,由于本申請實施例的憑證數(shù)據(jù)發(fā)放裝置中的憑證組標(biāo)識更新單元還用于憑證過期回收,其可在設(shè)定時間達(dá)到后強制有問題的服務(wù)器上對加載的憑證進(jìn)行放回數(shù)據(jù)庫的操作,以保證集群中其他有能力的服務(wù)器可以及時獲取到寶貴資源,從而進(jìn)一步降低了憑證發(fā)放失敗的概率。
本領(lǐng)域技術(shù)人員還可以了解到本申請實施例列出的各種說明性邏輯塊、單元和步驟可以通過硬件、軟件或兩者的結(jié)合來實現(xiàn)。至于是通過硬件還是軟件來實現(xiàn)取決于特定的應(yīng)用和整個系統(tǒng)的設(shè)計要求。本領(lǐng)域技術(shù)人員可以對于每種特定的應(yīng)用,可以使用各種方法實現(xiàn)所述的功能,但這種實現(xiàn)不應(yīng)被理解為超出本申請實施例保護(hù)的范圍。
本申請實施例中所描述的各種說明性的邏輯塊,或單元都可以通過通用處理器,數(shù)字信號處理器,專用集成電路(asic),現(xiàn)場可編程門陣列或其它可編程邏輯裝置,離散門或晶體管邏輯,離散硬件部件,或上述任何組合的設(shè)計來實現(xiàn)或操作所描述的功能。通用處理器可以為微處理器,可選地,該通用處理器也可以為任何傳統(tǒng)的處理器、控制器、微控制器或狀態(tài)機。處理器也可以通過計算裝置的組合來實現(xiàn),例如數(shù)字信號處理器和微處理器,多個微處理器,一個或多個微處理器聯(lián)合一個數(shù)字信號處理器核,或任何其它類似的配置來實現(xiàn)。
本申請實施例中所描述的方法或算法的步驟可以直接嵌入硬件、處理器執(zhí)行的軟件模塊、或者這兩者的結(jié)合。軟件模塊可以存儲于ram存儲器、閃存、rom存儲器、eprom存儲器、eeprom存儲器、寄存器、硬盤、可移動磁盤、cd-rom或本領(lǐng)域中其它任意形式的存儲媒介中。示例性地,存儲媒介可以與處理器連接,以使得處理器可以從存儲媒介中讀取信息,并可以向存儲媒介存寫信息??蛇x地,存儲媒介還可以集成到處理器中。處理器和存儲媒介可以設(shè)置于asic中,asic可以設(shè)置于用戶終端中??蛇x地,處理器和存儲媒介也可以設(shè)置于用戶終端中的不同的部件中。
在一個或多個示例性的設(shè)計中,本申請實施例所描述的上述功能可以在硬件、軟件、固件或這三者的任意組合來實現(xiàn)。如果在軟件中實現(xiàn),這些功能可以存儲與電腦可讀的媒介上,或以一個或多個指令或代碼形式傳輸于電腦可讀的媒介上。電腦可讀媒介包括電腦存儲媒介和便于使得讓電腦程序從一個地方轉(zhuǎn)移到其它地方的通信媒介。存儲媒介可以是任何通用或特殊電腦可以接入訪問的可用媒體。例如,這樣的電腦可讀媒體可以包括但不限于ram、rom、eeprom、cd-rom或其它光盤存儲、 磁盤存儲或其它磁性存儲裝置,或其它任何可以用于承載或存儲以指令或數(shù)據(jù)結(jié)構(gòu)和其它可被通用或特殊電腦、或通用或特殊處理器讀取形式的程序代碼的媒介。此外,任何連接都可以被適當(dāng)?shù)囟x為電腦可讀媒介,例如,如果軟件是從一個網(wǎng)站站點、服務(wù)器或其它遠(yuǎn)程資源通過一個同軸電纜、光纖電纜、雙絞線、數(shù)字用戶線(dsl)或以例如紅外、無線和微波等無線方式傳輸?shù)囊脖话谒x的電腦可讀媒介中。所述的碟片(disk)和磁盤(disc)包括壓縮磁盤、鐳射盤、光盤、dvd、軟盤和藍(lán)光光盤,磁盤通常以磁性復(fù)制數(shù)據(jù),而碟片通常以激光進(jìn)行光學(xué)復(fù)制數(shù)據(jù)。上述的組合也可以包含在電腦可讀媒介中。
以上所述的具體實施例,對本申請的目的、技術(shù)方案和有益效果進(jìn)行了進(jìn)一步詳細(xì)說明,所應(yīng)理解的是,以上所述僅為本申請實施例的具體實施例而已,并不用于限定本申請的保護(hù)范圍,凡在本申請的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請的保護(hù)范圍之內(nèi)。