迴圈有序的傳送通知實現方案

2021-09-24 03:12:21 字數 2079 閱讀 6430

上周五,同事從21樓下到14樓問我乙個問題,他們的產品想實現乙個有序並且迴圈的去傳送通知的乙個需求。同事一時沒想到比較好的解決方案,便找我來討論一下,有沒有更優的實現方式。於是我們便在14樓討論了一番,得出乙個相對比較好的解決方案,在此分享給大家,方便大家遇到類似的問題可以加以借鑑和參考。

假如資料庫有三條待傳送的通知模板a,b,c,按日期公升序排列,假如排列順序就是abc,則第一輪傳送順序為abc,第二輪傳送順序為abc,第三輪順序為abc,依次迴圈往復a->b->c->a->b->c...如下圖所示:

上面只是一種場景,突然有一天產品需要加入一條通知模板d,假如d的排列順序在c之後,這裡只是假設,也可能在abc任何乙個模板的前面,傳送順序則為下圖所示:

對以上傳送的要求是必須迴圈有序的傳送,需要支援任意排列順序後依然保持迴圈傳送。

1.初步分析

乍一看,這個問題不是很簡單嘛,放佇列不就好了嘛,你長得好看,說什麼都對,好像問題就這樣輕鬆被解決了,哈哈。。。但是具體怎麼實現呢?讓我們再仔細分析分析。

不知道大家發現問題沒有?上面的需求很清楚,是迴圈有序傳送。上面的方法貌似沒有實現迴圈啊,只是實現了有序而已,那麼問題又來了,怎麼實現迴圈呢?請看深入分析。

2.深入分析

上面分析的方法雖然可以保證順序,但是無法迴圈傳送,這該怎麼辦呢?於是我想到乙個佇列好像無法實現迴圈,那我就用兩個,嘿嘿。。。好像兩個佇列就解決了問題,事實真的是這樣嗎?我們繼續分析,假設我們建立了兩個佇列,乙個佇列是傳送佇列,另乙個是接收佇列。

3.最終分析

上面的分析基本上已經可以實現迴圈有序的傳送通知了,但是卻忽略了兩點,那麼是哪兩點呢?咱們接著分析!

如果產品需要新加入乙個模板通知d,那麼該怎麼辦?(換句話說就是d模板怎麼同步到快取佇列,並為其排好序)

快取佇列所依賴的伺服器掛了或者重啟了,那又該怎麼辦?(換句話說就是redis伺服器掛了或者重啟了)

對於第乙個問題,其實還是可以實現的,就是稍微麻煩一點(具體的做法,我這裡不在細細描述了,此處不是重點,感興趣的同學可以自己思考一下,也可以私下找我**)。

但是第二個問題就比較棘手了,伺服器掛了或者重啟了,所有的資料都丟失了,這該怎麼辦?有的人估計會想到redis可以持久化,即使掛了或者重啟也沒關係,其實這樣可以嗎?確實可以。

好像上面的方案確實可以解決可能發生的問題,並實現了需求功能,說實話,上面的方案是可行的,但是我卻沒有推薦同事用,原因是實現起來比較麻煩,那麼有沒有更簡單的方案呢?答案是肯定的。

通過前面的層層分析,我們發現乙個佇列似乎不能滿足需求,兩個佇列實現起來又比較麻煩,那麼我們可以不做這個需求嗎?哈哈。。。我也不想做,跟產品商量商量砍掉好了,嘿嘿。。。

我當時思考了一會,覺得肯定有更簡單的辦法,只是沒想到,於是大腦不停旋轉,突然想到了學習資料結構佇列時的實現方式,即迴圈佇列的實現方式(看過資料結構的應該知道這個),迴圈佇列的隊頭元素的指標指向下乙個元素,下乙個元素的指標繼續指向下下乙個,依次類推.......隊尾元素的指標又指向隊頭元素,如下圖所示:

由這個啟發,我聯想到當前的需求場景,我們是不是可以仿照迴圈佇列的實現方式來實現我們的需求呢?答案很明顯是可以的,而且實現起來超簡單,哈哈。。。具體怎麼實現呢?我們一起繼續探索!

首先我們知道了迴圈佇列的特點,跟我們的需求很類似,那麼我們就可以創造條件讓我們的通知模板帶有迴圈特性。

第一步,我們需要給資料庫通知模板表新增乙個是否已傳送的標記字段,可以用int型的0,1表示,0代表已傳送,1代表待傳送;

第二步,初始化模板資訊,排在第一位的為1,其餘為0。

第三步,每次傳送模板時只查詢出為1標記的去傳送,同時更新當前所傳送模板標記為0,並且更新排在下一位的模板標記為1,依次類推。

就上面的簡單3步,就輕鬆實現了迴圈有序傳送的需求,並且支援任意排序和追加新的模板進來,即使伺服器掛了重啟,也不會影響之前傳送的順序,真正達到了靈活多變,這個問題相對比較好的解決了。

nagios實現定時傳送通知

最近在做nagios監控,需要實現定時通知功能。找了一些資料,後邊加上了自己配置的詳細過程。這個是原文 在nagios配置基礎中,我已介紹了通知配置方法.當某個受監控系統不再可達時,nagios會傳送告警通知.預設情況下,nagios以郵件方式,將通知傳送給指定聯絡人.在本章中,你將學會如何配置系統...

PendingIntent的通知傳送

關於pendingintent傳值的問題,自己又發現了一些新的實現方法 現在我有這麼個需求 伺服器不停的向客戶端push訊息,客戶端在開機時或客戶端啟動時會開啟乙個service來接收伺服器push下來的訊息,客戶端接收訊息後向使用者傳送通知提示使用者有新的訊息,並且訊息中帶有引數。使用者通過點選通...

RocketMQ 訊息有序實現方案

在整個mq集群內,訊息都是按照生產者的生產順序存放,消費者也是按此順序進行消費 優點 生產者不需要額外的處理,由mq集群保證訊息全域性有序 缺點 犧牲了高可用 效能 高可用mq集群的常見部署 全域性有序部署方案 為了保證mq集群內訊息有序,對於全域性有序的topic,只會在一台broker機器上建立...