golang 實現延遲訊息原理與方法

2021-09-07 13:22:08 字數 2011 閱讀 1019

實現延遲訊息具體思路我是看的下面這篇文章

實現延遲訊息最主要的兩個結構:

環形佇列:通過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 版 有時候,我們會說,在計算機世界裡,其實只有兩種資料結構,乙個是陣列乙個是鍊錶。原因是其他的資料結構都是基於這兩種資料結構做的擴充套件。陣列和鍊錶的優缺點實在是非常的明顯。陣列可以高效查詢,按照下標索引,但是很難進行高效的刪除和擴容。鍊錶的優缺點正好相反。很多時候,...