我有一个HBase架构设计相关的问题。问题很简单 - 我在hbase中存储“通知”,每个都有一个状态(“新”,“看到”和“读取”)。这里有API的,我需要提供:设计HBase架构以最好地支持特定的查询
- 获取所有通知用户
- 获取所有用户
- “新”通知获取所有“新”通知的计数为用户 对于通知
- 更新状态
- 所有用户的通知更新状态
- 得到所有“新”的通知进行的跨数据库
- 通知笑可以按照逆时间顺序扫描并允许分页。
我有一些想法,我想看看他们中的一个是否最好,或者我完全错过了一个好策略。所有这三个共同点,我认为每个通知有一行,并在rowkey中有用户ID是要走的路。为了获得分页的时间顺序,我需要在那里有一个相反的时间戳。我想将所有notif保存在一个表中(所以我不必为“为用户获取所有通知”而不必合并排序),也不想为辅助索引表编写批处理作业(因为更新了计数和状态应该是实时的)。
最简单的方法是(1)行键为“userId_reverseTimestamp”并在客户端进行状态过滤。这似乎很天真,因为我们将通过网络发送大量不必要的数据。
下一种可能性是(2)将状态编码到rowkey中,以便对“userId_reverseTimestamp_status”进行编码,然后对扫描执行rowkey正则表达式过滤。我看到的第一个问题是需要删除一行,并在状态更改时将通知数据复制到新行(推测每次通知应该只发生两次)。此外,由于状态是rowkey的最后一部分,对于每个用户,我们将扫描大量额外的行。这是一个很大的表现?最后,为了改变状态,我需要知道以前的状态是什么(构建行键),否则我需要做另一次扫描。 (3)有两个列族,一个用于静态notif数据,另一个作为状态标志,即“s:read”或“s:new”与s '作为cf和作为限定词的地位。每行只有一个,我可以对该cf做一个MultipleColumnPrefixFilter或SkipFilter w/ColumnPrefixFilter。在这里,我将不得不删除和创建状态更改列,但它应该比复制整行更轻量级。我唯一担心的是HBase书中的警告:HBase与“2个或3个以上的专栏系列”不太一致 - 可能如果系统需要扩展更多的查询功能,multi-cf策略将不会扩展。
所以(1)似乎会有太多的网络开销。 (2)似乎会浪费复制数据的花费,(3)可能会导致太多家庭出现问题。在(2)和(3)之间,哪种类型的滤波器应该提供更好的性能?在这两种情况下,扫描都会查看用户的每一行,这可能主要是读取通知 - 这会有更好的性能。我认为我倾向于(3) - 是否还有其他选项(或调整),我错过了?
只有在从新到可能的单个转换过程中,通知才会显示'新'和'读'吗?这些通知的量是多少? – Gevorg