如何在Go?
中创建基于磁盘的延迟队列我正在编写一个Go程序,在一定的时间间隔后对数据采取某些操作。这是一个精简版。
func IncomingJob (data MyStruct) {
//Run immediately
dosomething(&data, 1)
time.Sleep(5 * time.Minute)
//Run after 5 minutes has passed from initial arrival
dosomething(&data, 2)
time.Sleep(5 * time.Minute)
//Run after 10 minutes has passed from initial arrival
dosomething(&data, 3)
time.Sleep(50 * time.Minute)
//Run after 60 minutes has passed from initial arrival
dosomething(&data, 4)
}
此函数将初始化为goroutinue。
go IncomingJob(data)
我遇到的问题是IncomingJob的每个实例运行60分钟,MyStruct
对象在该持续时间内保留在内存中。总内存使用量非常大。如果我想支持每小时100万次运行,这意味着在任何给定时间,内存中有100万个MyStruct
个对象在等待,什么都不做。我也可以使用time.AfterFunc
,但这并不会改变内存使用情况。
Go中是否有一些磁盘支持的FIFO队列/缓冲区实现?这样我可以有3个队列(用于不同的间隔)并轮询它并睡眠,直到轮询数据被重新处理的正确时间。这样,我会在序列化中丢失一些CPU周期,为其他内存应用程序添加I / O延迟,但会节省大量内存。
更新:time.AfterFunc
使用更少的内存。
func IncomingJob (data MyStruct) {
//Run immediately
dosomething(&data, 1)
time.AfterFunc(5 * time.Minute, func() {
//Run after 5 minutes has passed from initial arrival
dosomething(&data, 2)
time.AfterFunc(5 * time.Minute, func() {
//Run after 10 minutes has passed from initial arrival
dosomething(&data, 3)
})
time.AfterFunc(50 * time.Minute, func() {
//Run after 50 minutes has passed from initial arrival
dosomething(&data, 4)
})
})
}
答案 0 :(得分:0)
听起来像embedded database的工作。我确信FIFO可以很容易地通过例如建模。 NoSQL键/值存储。
您可能需要查看kv(此处作者)。捕获:值限制为64k,因此您可能需要从多个K / V对中组合单独的FIFO项。