我有一個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