我想在自己的flask應用程式中實作簡單的訊息通知功能,例如管理員向全體使用者發佈公告,或是想某個使用者發出提醒等功能。
可是在實現過程中遇到了一個難題,情況具體描述如下:
我使用sse機制來使伺服器向客戶端發送訊息,可是這裡出現了問題,就是發送訊息的模組並不知道什麼時候應該發送訊息,例如當用戶A評論了用戶B的部落格時,這時就需要通知用戶B,我們此時需要通知發送模組:“你該向B發送訊息了”,如何通知發送模組呢?
我想到的就是輪詢資料庫,但是感覺這樣太考驗伺服器的抗壓了,百度到說:每當對應的資料表更新,就產生一個訊息到Redis中,然後輪詢Redis。
這樣聽起來蠻好,可是在實作上遇到了很多問題:
例如:(1)redis是key-value存儲,當管理員既要給A發訊息,又要給B,C等發訊息,此時用key該如何區分?
(2)假设现在要给用户B发消息,那么会产生对应的消息存储在redis中,如果此刻
用户B并未登录呢,难道用户B一周不登录,该消息就会在redis中一周吗?
【我对redis不太了解,知道是在缓存中存储,所以感觉不可能在缓存中能存储一周】
思考兩三天了,望各位前輩能夠指點一二
阿神2017-04-27 09:05:46
redis pub/sub 訂閱/推送 ,是否考慮過使用這樣或者更高級的消息隊列中間件呢。
基本邏輯是這樣的,訊息是需要緩存在資料庫或其他nosql的。
拆分出訊息中心,使用redis的pub/sub體係或list,其他需要傳送訊息的透過redis通知訊息中心發送訊息。
訊息中心檢查使用者是否在線,在線直接發送訊息給用戶(透過websocket之類的,sse也可以),並標記已讀
用戶在線是拉取全部未讀訊息
無論在不在線訊息都要入庫。 。 。
由於redis的value是字串,要區分用戶,你只要、value是個json字串就好了。
{
"target":["a","b"],
"message":"我是要发送给用户a和b的消息"
}