首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HBase存储IM消息,RowKey该怎么设计?

HBase存储IM消息,RowKey该怎么设计?

作者头像
普通程序员
发布2019-10-23 14:11:15
2.4K0
发布2019-10-23 14:11:15
举报
文章被收录于专栏:普通程序员普通程序员

RowKey是HBase表设计中最重要的一个方面,它决定了应用程序与HBase表的交互方式,还会影响您从HBase中提取数据的性能。参看《HBase的表结构你设计得不对!》

一般IM系统的消息,以会话为维度,按照TimeLine模型存储。参看《基于TimeLine模型的消息同步机制》《TimeLine模型下确保消息有序不丢》

以下是瓜子IM系统消息存储的RowKey设计

一、RowKey的格式设计

会话ID和消息ID采用snowflake算法生成,RowKey包括了三部分内容。

会话hash值 | 会话id | 逆序消息id

会话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依照rowkey实现同样的分区效果,理论上和分库是一个效果。通过会话Id取模后的128个取值均匀散列到了不同region。

分区值为000—127,预分区效果如下图

采用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),用来做拉取最邻近的消息。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 普通程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
TDSQL MySQL 版
TDSQL MySQL 版(TDSQL for MySQL)是腾讯打造的一款分布式数据库产品,具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特性,同时提供智能 DBA、自动化运营、监控告警等配套设施,为客户提供完整的分布式数据库解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档