@@ -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,49 @@ 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+ switch d .cfg .ConsumerOpts .PipeliningStrategy {
142+ case SerialPipelining :
143+ fetchWg := & sync.WaitGroup {}
144+ fetches .EachPartition (func (partition kgo.FetchTopicPartition ) {
145+ fetchWg .Add (1 )
146+ itemWg := & sync.WaitGroup {}
147+
148+ go func () {
149+ defer fetchWg .Done ()
150+ partition .EachRecord (func (r * kgo.Record ) {
151+ itemWg .Add (1 )
152+ item := fromConsumer (r , d .requeueCh , d .recordsCh , itemWg , & d .stopped )
153+ d .insertTracedItem (item )
154+ itemWg .Wait ()
155+ })
156+ }()
157+ })
158+ fetchWg .Wait ()
159+ case FanOutPipelining :
160+ fetches .EachRecord (func (r * kgo.Record ) {
161+ item := fromConsumer (r , d .requeueCh , d .recordsCh , nil , & d .stopped )
162+ d .insertTracedItem (item )
163+ })
164+ default :
165+ return errors .New ("unknown consumer pipeliningStrategy" )
166+ }
150167
151168 if d .cfg .GroupOpts != nil {
152169 d .kafkaClient .AllowRebalance ()
153170 }
154171 }
155172}
156173
157- func fromConsumer (msg * kgo.Record , reqCh chan * Item , commCh chan * kgo.Record , stopped * uint64 ) * Item {
174+ func (d * Driver ) insertTracedItem (item * Item ) {
175+ ctxT , span := d .tracer .Tracer (tracerName ).Start (otel .GetTextMapPropagator ().Extract (context .Background (), propagation .HeaderCarrier (item .headers )), "kafka_listener" )
176+ d .prop .Inject (ctxT , propagation .HeaderCarrier (item .headers ))
177+
178+ d .pq .Insert (item )
179+
180+ span .End ()
181+ }
182+
183+ func fromConsumer (msg * kgo.Record , reqCh chan * Item , commCh chan * kgo.Record , doneWg * sync.WaitGroup , stopped * uint64 ) * Item {
158184 /*
159185 RRJob string = "rr_job"
160186 RRHeaders string = "rr_headers"
@@ -203,6 +229,7 @@ func fromConsumer(msg *kgo.Record, reqCh chan *Item, commCh chan *kgo.Record, st
203229 stopped : stopped ,
204230 requeueCh : reqCh ,
205231 commitsCh : commCh ,
232+ doneWg : doneWg ,
206233 record : msg ,
207234
208235 Options : & Options {
0 commit comments