實現延遲訊息具體思路我是看的下面這篇文章
實現延遲訊息最主要的兩個結構:環形佇列:通過golang中的陣列實現,分成3600個slot。
任務集合:通過map[key]*task,每個slot乙個map,map的值就是我們要執行的任務。
原理圖如下:
實現**如下:
package main;測試結果如下:import (
"time"
"errors"
"fmt"
)//延遲訊息
type delaymessage struct
//執行的任務函式
type taskfunc func(args ...inte***ce{});
//任務
type task struct ;
}//建立乙個延遲訊息
func newdelaymessage() *delaymessage ;
for i := 0; i < 3600; i++
return dm;
}//啟動延遲訊息
func (dm *delaymessage) start()
};}//關閉延遲訊息
func (dm *delaymessage) close()
//處理每1秒的任務
func (dm *delaymessage) taskloop() ();
for
default:
else }}
}} }
}//處理每1秒移動下標
func (dm *delaymessage) timeloop() ();
tick := time.newticker(time.second);
for
case
else
}} }
}//新增任務
func (dm *delaymessage) addtask(t time.time, key string, exec taskfunc, params inte***ce{}) error
//當前時間與指定時間相差秒數
subsecond := t.unix() - dm.starttime.unix();
//計算迴圈次數
cyclenum := int(subsecond / 3600);
//計算任務所在的slots的下標
ix := subsecond % 3600;
//把任務加入tasks中
tasks := dm.slots[ix];
if _, ok := tasks[key]; ok
tasks[key] = &task;
return nil;
}func main() ) , inte***ce{});
dm.addtask(time.now().add(time.second*10), "test2", func(args ...inte***ce{}) , inte***ce{});
dm.addtask(time.now().add(time.second*20), "test3", func(args ...inte***ce{}) , inte***ce{});
dm.addtask(time.now().add(time.second*30), "test4", func(args ...inte***ce{})
fmt.println("sum : ", sum);
}, inte***ce{});
//40秒後關閉
time.afterfunc(time.second*40, func() );
dm.start();
}
DelayQueue實現延遲訊息
最近想做乙個定時推送訊息的功能,經過調研了解到delayqueue,訊息物件需實現delayed介面裡的getdelay timeunit unit 方法,由於delayed繼承了comparable故需要實現compareto方法,可用於決定訊息的推送次序。以考試為例,設定每個考生的交卷時間點。學...
熔斷原理與實現Golang版
熔斷 熔斷機制其實是參考了我們日常生活中的保險絲的保護機制,當電路超負荷執行時,保險絲會自動的斷開,從而保證電路中的電器不受損害。而服務治理中的熔斷機制,指的是在發起服務呼叫的時候,如果被呼叫方返回的錯誤率超過一定的閾值,那麼後續的請求將不會真正發起請求,而是在呼叫方直接返回錯誤 在這種模式下,服務...
跳表的原理與實現 Golang 版
跳表的原理與實現 golang 版 有時候,我們會說,在計算機世界裡,其實只有兩種資料結構,乙個是陣列乙個是鍊錶。原因是其他的資料結構都是基於這兩種資料結構做的擴充套件。陣列和鍊錶的優缺點實在是非常的明顯。陣列可以高效查詢,按照下標索引,但是很難進行高效的刪除和擴容。鍊錶的優缺點正好相反。很多時候,...