@@ -4,14 +4,15 @@ import (
44 "context"
55 "encoding/binary"
66 "errors"
7+ "go.opentelemetry.io/otel"
8+ "go.opentelemetry.io/otel/propagation"
9+ "sync"
710 "sync/atomic"
811
912 "github.com/roadrunner-server/api/v4/plugins/v3/jobs"
1013 "github.com/roadrunner-server/events"
1114 "github.com/twmb/franz-go/pkg/kerr"
1215 "github.com/twmb/franz-go/pkg/kgo"
13- "go.opentelemetry.io/otel"
14- "go.opentelemetry.io/otel/propagation"
1516 "go.uber.org/zap"
1617)
1718
@@ -137,24 +138,50 @@ func (d *Driver) listen() error {
137138 }
138139 }
139140
140- fetches .EachRecord (func (r * kgo.Record ) {
141- item := fromConsumer (r , d .requeueCh , d .recordsCh , & d .stopped )
142-
143- ctxT , span := d .tracer .Tracer (tracerName ).Start (otel .GetTextMapPropagator ().Extract (context .Background (), propagation .HeaderCarrier (item .headers )), "kafka_listener" )
144- d .prop .Inject (ctxT , propagation .HeaderCarrier (item .headers ))
145-
146- d .pq .Insert (item )
147-
148- span .End ()
149- })
141+ d .log .Warn ("handling fetch errors" )
142+ switch d .cfg .ConsumerOpts .PipeliningStrategy {
143+ case SerialPipelining :
144+ fetchWg := & sync.WaitGroup {}
145+ fetches .EachPartition (func (partition kgo.FetchTopicPartition ) {
146+ fetchWg .Add (1 )
147+ itemWg := & sync.WaitGroup {}
148+
149+ go func () {
150+ defer fetchWg .Done ()
151+ partition .EachRecord (func (r * kgo.Record ) {
152+ itemWg .Add (1 )
153+ item := fromConsumer (r , d .requeueCh , d .recordsCh , itemWg , & d .stopped )
154+ d .insertTracedItem (item )
155+ itemWg .Wait ()
156+ })
157+ }()
158+ })
159+ fetchWg .Wait ()
160+ case FanOutPipelining :
161+ fetches .EachRecord (func (r * kgo.Record ) {
162+ item := fromConsumer (r , d .requeueCh , d .recordsCh , nil , & d .stopped )
163+ d .insertTracedItem (item )
164+ })
165+ default :
166+ return errors .New ("unknown consumer pipeliningStrategy" )
167+ }
150168
151169 if d .cfg .GroupOpts != nil {
152170 d .kafkaClient .AllowRebalance ()
153171 }
154172 }
155173}
156174
157- func fromConsumer (msg * kgo.Record , reqCh chan * Item , commCh chan * kgo.Record , stopped * uint64 ) * Item {
175+ func (d * Driver ) insertTracedItem (item * Item ) {
176+ ctxT , span := d .tracer .Tracer (tracerName ).Start (otel .GetTextMapPropagator ().Extract (context .Background (), propagation .HeaderCarrier (item .headers )), "kafka_listener" )
177+ d .prop .Inject (ctxT , propagation .HeaderCarrier (item .headers ))
178+
179+ d .pq .Insert (item )
180+
181+ span .End ()
182+ }
183+
184+ func fromConsumer (msg * kgo.Record , reqCh chan * Item , commCh chan * kgo.Record , doneWg * sync.WaitGroup , stopped * uint64 ) * Item {
158185 /*
159186 RRJob string = "rr_job"
160187 RRHeaders string = "rr_headers"
@@ -203,6 +230,7 @@ func fromConsumer(msg *kgo.Record, reqCh chan *Item, commCh chan *kgo.Record, st
203230 stopped : stopped ,
204231 requeueCh : reqCh ,
205232 commitsCh : commCh ,
233+ doneWg : doneWg ,
206234 record : msg ,
207235
208236 Options : & Options {
0 commit comments