溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

HBase存儲(chǔ)IM消息中RowKey該怎么設(shè)計(jì)

發(fā)布時(shí)間:2021-12-08 15:22:25 來(lái)源:億速云 閱讀:281 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)HBase存儲(chǔ)IM消息中RowKey該怎么設(shè)計(jì),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

RowKey是HBase表設(shè)計(jì)中最重要的一個(gè)方面,它決定了應(yīng)用程序與HBase表的交互方式,還會(huì)影響您從HBase中提取數(shù)據(jù)的性能。

一般IM系統(tǒng)的消息,以會(huì)話為維度,按照TimeLine模型存儲(chǔ)。

以下是IM系統(tǒng)消息存儲(chǔ)的RowKey設(shè)計(jì)

一、RowKey的格式設(shè)計(jì)

會(huì)話ID和消息ID采用snowflake算法生成,RowKey包括了三部分內(nèi)容。

會(huì)話hash值 | 會(huì)話id | 逆序消息id  

HBase存儲(chǔ)IM消息中RowKey該怎么設(shè)計(jì)

會(huì)話hash值的目的為數(shù)據(jù)分區(qū)(region)存儲(chǔ),預(yù)分區(qū)能夠分?jǐn)倲?shù)據(jù)讀寫壓力;

會(huì)話id確定唯一會(huì)話,一個(gè)群里的所有消息擁有相同的會(huì)話id;

逆序消息id確定唯一消息和拉取最新消息序,逆序確保越新的消息id值越小,IM軟件里,總是先顯示群里的最新消息,向上滑動(dòng)界面再加載之前的消息

“|”的作用在為分隔數(shù)據(jù)位。由于部分id可能長(zhǎng)度不是一致(snowflake),所以選用了“|”為分隔,確保能夠無(wú)歧義的反解出個(gè)部分?jǐn)?shù)據(jù)。

二、region的分區(qū)設(shè)計(jì)

IM業(yè)務(wù)特點(diǎn)決定,同一會(huì)話的消息,一般會(huì)集中讀取(用戶查看某個(gè)聊天的消息就是這種場(chǎng)景)。因此需要把同一會(huì)話的消息存儲(chǔ)在一個(gè)分區(qū)。我們采用會(huì)話id的hash值來(lái)做分區(qū)字段,能夠確保同一會(huì)話的消息一定在同一分區(qū)。

會(huì)話ID采用了改造后的SnowFlake算法(參看《ID生成策略——SnowFlake》),會(huì)話id除以2的n次方,數(shù)據(jù)都能比較平均的分配(如果id沒(méi)有這個(gè)特性,也可以選用其他hash方式)。

在沒(méi)有采用HBase存儲(chǔ)消息之前,消息使用Mysql存儲(chǔ)。采用會(huì)話Id%4,分為4個(gè)庫(kù)。如下圖

HBase存儲(chǔ)IM消息中RowKey該怎么設(shè)計(jì)

HBase依照rowkey實(shí)現(xiàn)同樣的分區(qū)效果,理論上和分庫(kù)是一個(gè)效果。通過(guò)會(huì)話Id取模后的128個(gè)取值均勻散列到了不同region。

HBase存儲(chǔ)IM消息中RowKey該怎么設(shè)計(jì)

分區(qū)值為000—127,預(yù)分區(qū)效果如下圖

HBase存儲(chǔ)IM消息中RowKey該怎么設(shè)計(jì)

采用rowkey前置3位預(yù)分區(qū),每一個(gè)rowkey到來(lái)時(shí),選取與region相同位數(shù)的前3位進(jìn)行匹配,例圖中,002|…..|….rowkey會(huì)選擇3位002進(jìn)行region匹配,然后把數(shù)據(jù)放入對(duì)應(yīng)分區(qū)。

三、消息存取過(guò)程

1、依照上述設(shè)計(jì)格式,我們用傳參后的會(huì)話Id,002|***|***取模128—以此分散到不同的region;

2、確定具體region后依照rowkey的后續(xù)***|312312312312312312312|***的會(huì)話Id確定唯一的會(huì)話;

3、確定唯一會(huì)話后依照rowkey的后續(xù)消息Id確定某一個(gè)具體消息***|***|8896232141957373907,注意這個(gè)消息Id已經(jīng)被逆序處理(Long.MAX_VALUE-消息Id),用來(lái)做拉取最鄰近的消息。 

關(guān)于HBase存儲(chǔ)IM消息中RowKey該怎么設(shè)計(jì)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI