Add heartbeat goroutine to write heartbeat data to redis for active

worker
This commit is contained in:
Ken Hibino
2019-11-22 06:43:42 -08:00
parent 80f477212d
commit 2e0af11ca0
2 changed files with 48 additions and 9 deletions

View File

@@ -78,18 +78,37 @@ func (p *processor) exec() {
}
}
t := &Task{Type: msg.Type, Payload: msg.Payload}
task := &Task{Type: msg.Type, Payload: msg.Payload}
p.sema <- struct{}{} // acquire token
go func(task *Task) {
quit := make(chan struct{}) // channel to signal heartbeat goroutine
defer func() {
quit <- struct{}{}
if err := p.rdb.srem(inProgress, msg); err != nil {
log.Printf("[SERVER ERROR] SREM failed: %v\n", err)
}
if err := p.rdb.clearHeartbeat(msg.ID); err != nil {
log.Printf("[SERVER ERROR] DEL heartbeat failed: %v\n", err)
}
<-p.sema // release token
}()
err := p.handler(task)
// start "heartbeat" goroutine
go func() {
ticker := time.NewTicker(5 * time.Second)
for {
select {
case <-quit:
return
case t := <-ticker.C:
if err := p.rdb.heartbeat(msg.ID, t); err != nil {
log.Printf("[ERROR] heartbeat failed for %v at %v: %v", msg.ID, t, err)
}
}
}
}()
err := p.handler(task) // TODO(hibiken): maybe also handle panic?
if err != nil {
retryTask(p.rdb, msg, err)
}
}(t)
}(task)
}