adjust channel ownership for group
This commit is contained in:
parent
4fd29c54ff
commit
0328cba5c9
4 changed files with 18 additions and 24 deletions
13
allgroup.go
13
allgroup.go
|
|
@ -33,11 +33,8 @@ type AllGroup struct {
|
|||
|
||||
// start is a blocking operation which will loop and attempt to find new
|
||||
// shards on a regular cadence.
|
||||
func (g *AllGroup) Start(ctx context.Context) chan *kinesis.Shard {
|
||||
var (
|
||||
shardc = make(chan *kinesis.Shard, 1)
|
||||
ticker = time.NewTicker(30 * time.Second)
|
||||
)
|
||||
func (g *AllGroup) Start(ctx context.Context, shardc chan *kinesis.Shard) {
|
||||
var ticker = time.NewTicker(30 * time.Second)
|
||||
g.findNewShards(shardc)
|
||||
|
||||
// Note: while ticker is a rather naive approach to this problem,
|
||||
|
|
@ -49,7 +46,6 @@ func (g *AllGroup) Start(ctx context.Context) chan *kinesis.Shard {
|
|||
// necessarily close at the same time, so we could potentially get a
|
||||
// thundering heard of notifications from the consumer.
|
||||
|
||||
go func() {
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
|
|
@ -59,9 +55,6 @@ func (g *AllGroup) Start(ctx context.Context) chan *kinesis.Shard {
|
|||
g.findNewShards(shardc)
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
return shardc
|
||||
}
|
||||
|
||||
func (g *AllGroup) GetCheckpoint(streamName, shardID string) (string, error) {
|
||||
|
|
@ -83,7 +76,7 @@ func (g *AllGroup) findNewShards(shardc chan *kinesis.Shard) {
|
|||
|
||||
shards, err := listShards(g.ksis, g.streamName)
|
||||
if err != nil {
|
||||
g.logger.Log("[GROUP]", err)
|
||||
g.logger.Log("[GROUP] error:", err)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -88,10 +88,11 @@ func (c *Consumer) Scan(ctx context.Context, fn ScanFunc) error {
|
|||
|
||||
var (
|
||||
errc = make(chan error, 1)
|
||||
shardc = c.group.Start(ctx)
|
||||
shardc = make(chan *kinesis.Shard, 1)
|
||||
)
|
||||
|
||||
go func() {
|
||||
c.group.Start(ctx, shardc)
|
||||
<-ctx.Done()
|
||||
close(shardc)
|
||||
}()
|
||||
|
|
@ -130,9 +131,9 @@ func (c *Consumer) ScanShard(ctx context.Context, shardID string, fn ScanFunc) e
|
|||
return fmt.Errorf("get shard iterator error: %v", err)
|
||||
}
|
||||
|
||||
c.logger.Log("[START]\t", shardID, lastSeqNum)
|
||||
c.logger.Log("[CONSUMER] start scan:", shardID, lastSeqNum)
|
||||
defer func() {
|
||||
c.logger.Log("[STOP]\t", shardID)
|
||||
c.logger.Log("[CONSUMER] stop scan:", shardID)
|
||||
}()
|
||||
|
||||
for {
|
||||
|
|
@ -176,7 +177,7 @@ func (c *Consumer) ScanShard(ctx context.Context, shardID string, fn ScanFunc) e
|
|||
}
|
||||
|
||||
if isShardClosed(resp.NextShardIterator, shardIterator) {
|
||||
c.logger.Log("[CLOSED]\t", shardID)
|
||||
c.logger.Log("[CONSUMER] shard closed:", shardID)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ Export the required environment vars for connecting to the Kinesis stream:
|
|||
|
||||
```
|
||||
export AWS_PROFILE=
|
||||
export AWS_REGION_NAME=
|
||||
export AWS_REGION=
|
||||
```
|
||||
|
||||
### Running the code
|
||||
|
|
|
|||
2
group.go
2
group.go
|
|
@ -8,7 +8,7 @@ import (
|
|||
|
||||
// Group interface used to manage which shard to process
|
||||
type Group interface {
|
||||
Start(ctx context.Context) chan *kinesis.Shard
|
||||
Start(ctx context.Context, shardc chan *kinesis.Shard)
|
||||
GetCheckpoint(streamName, shardID string) (string, error)
|
||||
SetCheckpoint(streamName, shardID, sequenceNumber string) error
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue