Remove poll interval in favor of aws retry backoff
This commit is contained in:
parent
dded9d0a0e
commit
e843ae5928
2 changed files with 19 additions and 24 deletions
|
|
@ -25,7 +25,6 @@ func main() {
|
||||||
|
|
||||||
// override default values
|
// override default values
|
||||||
c.Set("maxBatchCount", 200)
|
c.Set("maxBatchCount", 200)
|
||||||
c.Set("pollInterval", "3s")
|
|
||||||
|
|
||||||
// start consuming records from the queues
|
// start consuming records from the queues
|
||||||
c.Start(connector.HandlerFunc(func(b connector.Buffer) {
|
c.Start(connector.HandlerFunc(func(b connector.Buffer) {
|
||||||
|
|
|
||||||
42
consumer.go
42
consumer.go
|
|
@ -2,7 +2,6 @@ package connector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
|
@ -11,7 +10,6 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
pollInterval = 1 * time.Second
|
|
||||||
maxBatchCount = 1000
|
maxBatchCount = 1000
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -38,17 +36,9 @@ type Consumer struct {
|
||||||
|
|
||||||
// Set `option` to `value`
|
// Set `option` to `value`
|
||||||
func (c *Consumer) Set(option string, value interface{}) {
|
func (c *Consumer) Set(option string, value interface{}) {
|
||||||
var err error
|
|
||||||
|
|
||||||
switch option {
|
switch option {
|
||||||
case "maxBatchCount":
|
case "maxBatchCount":
|
||||||
maxBatchCount = value.(int)
|
maxBatchCount = value.(int)
|
||||||
case "pollInterval":
|
|
||||||
pollInterval, err = time.ParseDuration(value.(string))
|
|
||||||
if err != nil {
|
|
||||||
logger.Log("fatal", "ParseDuration", "msg", "unable to parse pollInterval value")
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
logger.Log("fatal", "Set", "msg", "unknown option")
|
logger.Log("fatal", "Set", "msg", "unknown option")
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|
@ -76,12 +66,20 @@ func (c *Consumer) Start(handler Handler) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Consumer) handlerLoop(shardID string, handler Handler) {
|
func (c *Consumer) handlerLoop(shardID string, handler Handler) {
|
||||||
|
buf := &Buffer{
|
||||||
|
MaxBatchCount: maxBatchCount,
|
||||||
|
}
|
||||||
|
|
||||||
|
checkpoint := &Checkpoint{
|
||||||
|
AppName: c.appName,
|
||||||
|
StreamName: c.streamName,
|
||||||
|
}
|
||||||
|
|
||||||
params := &kinesis.GetShardIteratorInput{
|
params := &kinesis.GetShardIteratorInput{
|
||||||
ShardId: aws.String(shardID),
|
ShardId: aws.String(shardID),
|
||||||
StreamName: aws.String(c.streamName),
|
StreamName: aws.String(c.streamName),
|
||||||
}
|
}
|
||||||
|
|
||||||
checkpoint := &Checkpoint{AppName: c.appName, StreamName: c.streamName}
|
|
||||||
if checkpoint.CheckpointExists(shardID) {
|
if checkpoint.CheckpointExists(shardID) {
|
||||||
params.ShardIteratorType = aws.String("AFTER_SEQUENCE_NUMBER")
|
params.ShardIteratorType = aws.String("AFTER_SEQUENCE_NUMBER")
|
||||||
params.StartingSequenceNumber = aws.String(checkpoint.SequenceNumber())
|
params.StartingSequenceNumber = aws.String(checkpoint.SequenceNumber())
|
||||||
|
|
@ -97,13 +95,14 @@ func (c *Consumer) handlerLoop(shardID string, handler Handler) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
b := &Buffer{MaxBatchCount: maxBatchCount}
|
|
||||||
shardIterator := resp.ShardIterator
|
shardIterator := resp.ShardIterator
|
||||||
|
|
||||||
for {
|
for {
|
||||||
resp, err := c.svc.GetRecords(&kinesis.GetRecordsInput{
|
resp, err := c.svc.GetRecords(
|
||||||
ShardIterator: shardIterator,
|
&kinesis.GetRecordsInput{
|
||||||
})
|
ShardIterator: shardIterator,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
awsErr, _ := err.(awserr.Error)
|
awsErr, _ := err.(awserr.Error)
|
||||||
|
|
@ -113,20 +112,17 @@ func (c *Consumer) handlerLoop(shardID string, handler Handler) {
|
||||||
|
|
||||||
if len(resp.Records) > 0 {
|
if len(resp.Records) > 0 {
|
||||||
for _, r := range resp.Records {
|
for _, r := range resp.Records {
|
||||||
b.AddRecord(r)
|
buf.AddRecord(r)
|
||||||
|
|
||||||
if b.ShouldFlush() {
|
if buf.ShouldFlush() {
|
||||||
handler.HandleRecords(*b)
|
handler.HandleRecords(*buf)
|
||||||
checkpoint.SetCheckpoint(shardID, b.LastSeq())
|
checkpoint.SetCheckpoint(shardID, buf.LastSeq())
|
||||||
b.Flush()
|
buf.Flush()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if resp.NextShardIterator == aws.String("") || shardIterator == resp.NextShardIterator {
|
} else if resp.NextShardIterator == aws.String("") || shardIterator == resp.NextShardIterator {
|
||||||
logger.Log("fatal", "nextShardIterator", "msg", err.Error())
|
logger.Log("fatal", "nextShardIterator", "msg", err.Error())
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
} else {
|
|
||||||
logger.Log("info", "sleeping", "msg", "no records to process")
|
|
||||||
time.Sleep(pollInterval)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
shardIterator = resp.NextShardIterator
|
shardIterator = resp.NextShardIterator
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue