1
0
mirror of https://blitiri.com.ar/repos/chasquid synced 2025-12-18 14:47:03 +00:00

queue: Incremental delays

This patch introduces incremental delays in the queue, so retries are not all
done with the same delay.

The table is static; we could perturb it but there's not that much benefit
anyway, at least for now.
This commit is contained in:
Alberto Bertogli
2015-11-13 02:06:53 +00:00
parent 4de805ab34
commit 17c536f5e3

View File

@@ -144,6 +144,7 @@ func (item *Item) SendLoop(q *Queue) {
tr.LazyPrintf("from: %s", item.From) tr.LazyPrintf("from: %s", item.From)
var err error var err error
var delay time.Duration
for time.Since(item.Created) < giveUpAfter { for time.Since(item.Created) < giveUpAfter {
// Send to all recipients that are still pending. // Send to all recipients that are still pending.
var wg sync.WaitGroup var wg sync.WaitGroup
@@ -188,14 +189,23 @@ func (item *Item) SendLoop(q *Queue) {
// TODO: Consider sending a non-final notification after 30m or so, // TODO: Consider sending a non-final notification after 30m or so,
// that some of the messages have been delayed. // that some of the messages have been delayed.
// TODO: Next attempt incremental wrt. previous one. delay = nextDelay(delay)
// Do 3m, 5m, 10m, 15m, 40m, 60m, 2h, 5h, 12h, perturbed. glog.Infof("%s waiting for %v", item.ID, delay)
// Put a table and function below, to change this easily. time.Sleep(delay)
// We should track the duration of the previous one too? Or computed
// based on created?
time.Sleep(30 * time.Second)
} }
// TODO: Send a notification message for the recipients we failed to send. // TODO: Send a notification message for the recipients we failed to send.
} }
func nextDelay(last time.Duration) time.Duration {
switch {
case last < 1*time.Minute:
return 1 * time.Minute
case last < 5*time.Minute:
return 5 * time.Minute
case last < 10*time.Minute:
return 10 * time.Minute
default:
return 20 * time.Minute
}
}