短報文訊息傳送的模組設計實現

2022-06-03 02:15:09 字數 897 閱讀 2513

曾接觸到乙個報文傳送的專案,這個專案的報文傳送,雖有報文優先順序,但卻無按照報文優先順序傳送的功能。

因此,我便思考了一下,將自己的設計思路發出來,與大家共享。

首先明確的是,我所設想的報文傳送是基於 redis的 sortedset 資料儲存結構,之所以可以選擇這個結構是因為每個報文都有不同的id。

報文有三個優先順序:高、中、低;報文有兩個型別:定時傳送報文和普通傳送報文。

因之前並未深入接觸過redis,在redis中 sortedset 提供了自動排序的功能,那麼之前的一堆設計均可以忽略掉。可以直接使用該特性來設計。

報文優先順序:普通報文集合 高、中、低 使用同乙個集合,並設定不同的權重

定時報文集合 定時報文按照傳送時間戳設定權重,最小的時間戳權重最高(計算方式使用 2023年1月1日 減去該報文時間戳)  

需要的執行緒及其所實現的功能:

普通報文獲取執行緒,直接按配置數量獲取報文,並刪除redis快取相應數量的報文,使用lpop

定時報文獲取執行緒,直接獲取最高權重的報文,並獲取該報文的時間戳,比較該時間戳是否需要傳送,需要傳送,則保留且刪除快取該報文zrem,不需要則sleep(1000)後再獲取

這樣獲取到報文後,直接等待傳送執行緒消費即可。

這兩個執行緒獲取報文均有乙個上限配置。

這兩個執行緒獲取到報文後,等待wait,未獲取到任何報文時,則sleep(1000)後再獲取。

傳送執行緒: 在每個傳送週期(序列的),優先獲取定時佇列的報文,未獲取到,則獲取普通佇列報文;傳送後,將報文放入**執行緒訪問map中。

**執行緒: 若傳送異常,**報文狀態變為異常。

定時處理異常執行緒:自動蒐集當前時間之前的,傳送異常的報文,根據(異常規則)判斷報文是否可以再次傳送,如果可傳送,則放入普通報文集合,否則不傳送,並將狀態置為傳送失敗。

php實現傳送微信模板訊息的方法

該方法基於thinkphp實現實現,具體orderpush.class.php檔案如下 複製 如下 namespace org weixin created by phpstorm.user standopen date 15 1 7 time 9 41 class orderpush 傳送post...

Socket 伺服器設計核心 傳送訊息的快取

伺服器對全域性傳送訊息必須有個快取。原因如下 假設伺服器的運算瓶頸是每秒鐘傳送100個資訊 如果這個時候伺服器本身產生的傳送訊息資料遠遠大於了這個數量,會導致伺服器宕機,即使不宕機也執行出現異常。而且有可能突然間訪問量暴增,如果在socket這一層面可以阻止過高的訪問量,那麼剩下的就是運算瓶頸。這2...

投票模組的設計與實現

投票功能在日常上網中隨處可見,特別是在bbs中。它不但直觀的反映了對某種事物的看法,而且能很好的聚集人氣。那麼就開始對投票這個功能模組進行設計。第一讓我們看看流程圖 這是個很簡單的應用系統就是負責寫入資料庫在顯示出來給使用者 現在開始實現這個功能 首先我在mysql資料庫中建立如下的表 這三個分別對...