溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

HBase存儲IM消息中RowKey該怎么設計

發布時間:2021-12-08 15:22:25 來源:億速云 閱讀:308 作者:柒染 欄目:大數據

這篇文章將為大家詳細講解有關HBase存儲IM消息中RowKey該怎么設計,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

RowKey是HBase表設計中最重要的一個方面,它決定了應用程序與HBase表的交互方式,還會影響您從HBase中提取數據的性能。

一般IM系統的消息,以會話為維度,按照TimeLine模型存儲。

以下是IM系統消息存儲的RowKey設計

一、RowKey的格式設計

會話ID和消息ID采用snowflake算法生成,RowKey包括了三部分內容。

會話hash值 | 會話id | 逆序消息id  

HBase存儲IM消息中RowKey該怎么設計

會話hash值的目的為數據分區(region)存儲,預分區能夠分攤數據讀寫壓力;

會話id確定唯一會話,一個群里的所有消息擁有相同的會話id;

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

“|”的作用在為分隔數據位。由于部分id可能長度不是一致(snowflake),所以選用了“|”為分隔,確保能夠無歧義的反解出個部分數據。

二、region的分區設計

IM業務特點決定,同一會話的消息,一般會集中讀?。ㄓ脩舨榭茨硞€聊天的消息就是這種場景)。因此需要把同一會話的消息存儲在一個分區。我們采用會話id的hash值來做分區字段,能夠確保同一會話的消息一定在同一分區。

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

在沒有采用HBase存儲消息之前,消息使用Mysql存儲。采用會話Id%4,分為4個庫。如下圖

HBase存儲IM消息中RowKey該怎么設計

HBase依照rowkey實現同樣的分區效果,理論上和分庫是一個效果。通過會話Id取模后的128個取值均勻散列到了不同region。

HBase存儲IM消息中RowKey該怎么設計

分區值為000—127,預分區效果如下圖

HBase存儲IM消息中RowKey該怎么設計

采用rowkey前置3位預分區,每一個rowkey到來時,選取與region相同位數的前3位進行匹配,例圖中,002|…..|….rowkey會選擇3位002進行region匹配,然后把數據放入對應分區。

三、消息存取過程

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

2、確定具體region后依照rowkey的后續***|312312312312312312312|***的會話Id確定唯一的會話;

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

關于HBase存儲IM消息中RowKey該怎么設計就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女