簡體   English   中英

大量DB讀寫操作的設計選項

[英]Design option for Heavy DB Read and Write operation

我有一個將消息發送給數百萬用戶的系統。

集群中有6個應用程序節點,其中一個公共oracle數據庫(RAC)。

在一種用例中,我們必須向用戶發送消息,並且一旦傳遞消息,就必須在db表中更新一個計數器,該計數器的詳細信息為no。 發送給用戶的郵件數量。 我們也有一個限制,即每天必須僅向用戶發送n個消息。

So, 1) Every time before sending the message, we have to read the database to fetch the counter value. 2) Every time after sending the message,we have to update the counter.

任何節點都可以接收任何用戶的消息,並且可以並行讀取和更新數據庫。

現在,我們面臨的問題是每個節點每秒不能處理超過1K條消息。 在高峰負載期間,所有線程都在讀取或更新數據庫。

我們正在考慮引入一種緩存機制來避免DB調用。 但是,由於這里寫入數據庫的內容也很大,因此我們認為緩存可能不是解決方案。

您是否有更好的建議或體系結構可以通過對DB進行大量讀寫操作來處理此用例? 如果遇到這種情況,您會提出什么解決方案?

如果您需要更多信息,請告訴我。

一種可能性是完全從數據庫中刪除應用程序。 而是讓他們將作業發布在隊列中。 讓隊列工作者從隊列中提取作業,讀取/寫入數據庫,然后將結果發布到某種形式的結果緩存中。 然后,應用程序可以輪詢結果緩存以獲取其結果。

雖然這不會減少數據庫的讀/寫次數,但可以讓您對整個應用程序進行分層。 例如,您可以有一個用於過濾隊列中作業的層,將多個計數器更新捆綁在一起,然后讓工作人員一次將其全部寫入。

另一個明顯的可能性是仔細查看您的體系結構並決定是否需要更改數據庫技術。 如果您不過度依賴聯接,復雜的SQL查詢等,請查看鍵值存儲或NoSQL。 看看Cassandra的性能。

這次采訪是關於Reddit的體系結構的,它可能會給您一些不錯的想法。 (它還顯示了我提到的輔助方法/隊列方法)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM