問題內容
上下文
我有很多帖子,每個帖子的贊成票和反對票計數都存儲在我的 Postgres 數據庫中。我正在運行 Gin Golang 服務器、Flutter 移動應用,并使用 FCM(Firebase 云消息傳遞)向用戶發送通知。
架構問題
首先,這個問題很容易解決。我只是不知道如何有效解決它。
我想大約每天向每個用戶發送一次得票最高的帖子。但是,我想根據用戶在應用程序中最活躍的時間向他們發送通知(不是一次全部發送,即不僅僅是每天上午 12 點)。
所以,假設我在一個名為 active_times
的表中跟蹤每個用戶的一個條目,該條目有一個我根據他們與移動應用程序(如 Postgres 中的 time
)交互時更新的字段。我根據用戶活動不斷更新。
我的直覺告訴我,我應該每隔約 2 小時在我的服務器中運行一個 cron 作業,該作業會查詢在該約 2 小時窗口內擁有 time
字段的所有用戶。然后,我將置頂帖子通知發送給這些用戶。然后,我在 Redis 緩存中保存一個映射 user_id
s 到 time_notification_recieved
s 的哈希集,并將自動過期設置為大約 12 小時。對于每個后續查詢,我首先檢查Redis中的if user_id,不要發送給該用戶,否則,發送并將id添加到Redis
。
這將允許我有一個窗口,如果用戶在通知發送給他們后突然登錄或直接在應用程序上進行交互(將他們的活動轉移到 time
),他們最多會在 12 小時內收到通知稍后,但通常由于其活動窗口不會發生太大變化,因此大約每 24 小時(每天)發送一次。例如,這與他們的 time
窗口是下午 2 點相反,然后在我向他們發送通知后,它更新到下午 4 點,他們在 2 小時內再次受到攻擊。
備注
這是一種有效的方法嗎?我最初考慮使用 Postgres 數據庫來存儲所有這些 ID,但我認為這可能很快就會壓垮數據庫。
此外,Redis 就是用來做這種事情的嗎?我可以采取完全不同的方法來做到這一點嗎?
謝謝!
正確答案
在您擁有數百萬用戶之前,您每隔幾個小時執行的任何操作都會非常高效。
我會在用戶表中有一個單獨的列(例如),其中包含“下一個通知時間”,用于安排通知。我想您不希望出現這樣的情況:用戶正在使用系統,然后立即收到通知,對嗎?
為了確定何時發送通知,您可以使用一個帶有迷你活動直方圖的表格;類似的東西
用戶 ID
一天中的某個時間
柜臺
然后每當用戶進行“活動”時就會增加計數器。然后,在計算“下次發送通知的時間”時,您可以查看此表以找到該特定用戶的最佳時間。隨著時間的推移,您可以改進算法,使其變得更加復雜,而不僅僅是活動計數。 (也許您希望在用戶通常活躍之前一小時收到通知?或者可能是他們有時使用該應用程序但不習慣使用的時間,等等)。