1. 程式人生 > >短報文消息發送的模塊設計實現

短報文消息發送的模塊設計實現

gin 消息 發送 lis 自動 再次 超過 線程 數量

曾接觸到一個報文發送的項目,這個項目的報文發送,雖有報文優先級,但卻無按照報文優先級發送的功能。

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

首先明確的是,我所設想的報文發送是基於 Redis的 List 數據存儲結構。

報文有三個優先級:高、中、低;報文有兩個類型:定時發送報文和普通發送報文。

這些報文按照優先級,存儲到 high、midium、low的三個List中,以下間記為H、M、L;按照定時發送報文存儲到 time(時間,精確到秒) List中,以下間記為T。

需要的線程及其所實現的功能:

定時隊列報文獲取線程: 獲取LastTimeStamp及其之後5秒的報文,並設置LastTimeStamp為獲取的最新時間戳,下個周期獲取時,判斷LastTimeStamp是否超過當前時間,若超過則為當前時間。          

普通隊列報文獲取線程: 優先獲得高優先級隊列中的,若獲取的報文少於配置的數量,則獲取中隊列的以補上。

這兩個線程獲取報文均有一個上限配置。

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

發送線程: 在每個發送周期(串行的),優先獲取定時隊列的報文,未獲取到,則獲取普通隊列報文;發送。

回調線程: 若發送異常,回調報文狀態變為異常。

定時處理異常線程:自動搜集當前時間之前的,發送異常的報文,根據(異常規則)判斷報文是否可以再次發送,如果可發送,則根據優先級,放入 高、中、低的三個隊列,否則不發送,並將狀態置為發送失敗。 這個線程使用LPUSH將報文放入對應的優先級,以便優先發送。

短報文消息發送的模塊設計實現