Calling the function that handles kafka messages, asynchronously (#1355)
This commit is contained in:
committed by
Ta-Ching Chen
parent
e42f81a7a1
commit
22de11190c
@@ -167,9 +167,7 @@ func (kafka Kafka) subscribe(trigger *fv1.MessageQueueTrigger) (messageQueueSubs
|
|||||||
go func() {
|
go func() {
|
||||||
for msg := range consumer.Messages() {
|
for msg := range consumer.Messages() {
|
||||||
kafka.logger.Debug("calling message handler", zap.String("message", string(msg.Value[:])))
|
kafka.logger.Debug("calling message handler", zap.String("message", string(msg.Value[:])))
|
||||||
if kafkaMsgHandler(&kafka, producer, trigger, msg) {
|
go kafkaMsgHandler(&kafka, producer, trigger, msg, consumer)
|
||||||
consumer.MarkOffset(msg, "") // mark message as processed
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@@ -201,7 +199,7 @@ func (kafka Kafka) unsubscribe(subscription messageQueueSubscription) error {
|
|||||||
return subscription.(*cluster.Consumer).Close()
|
return subscription.(*cluster.Consumer).Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
func kafkaMsgHandler(kafka *Kafka, producer sarama.SyncProducer, trigger *fv1.MessageQueueTrigger, msg *sarama.ConsumerMessage) bool {
|
func kafkaMsgHandler(kafka *Kafka, producer sarama.SyncProducer, trigger *fv1.MessageQueueTrigger, msg *sarama.ConsumerMessage, consumer *cluster.Consumer) {
|
||||||
var value string = string(msg.Value[:])
|
var value string = string(msg.Value[:])
|
||||||
// Support other function ref types
|
// Support other function ref types
|
||||||
if trigger.Spec.FunctionReference.Type != types.FunctionReferenceTypeFunctionName {
|
if trigger.Spec.FunctionReference.Type != types.FunctionReferenceTypeFunctionName {
|
||||||
@@ -227,7 +225,7 @@ func kafkaMsgHandler(kafka *Kafka, producer sarama.SyncProducer, trigger *fv1.Me
|
|||||||
kafka.logger.Error("failed to create HTTP request to invoke function",
|
kafka.logger.Error("failed to create HTTP request to invoke function",
|
||||||
zap.Error(err),
|
zap.Error(err),
|
||||||
zap.String("function_url", url))
|
zap.String("function_url", url))
|
||||||
return false
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the headers came from Kafka record
|
// Set the headers came from Kafka record
|
||||||
@@ -270,7 +268,7 @@ func kafkaMsgHandler(kafka *Kafka, producer sarama.SyncProducer, trigger *fv1.Me
|
|||||||
kafka.logger.Warn("every function invocation retry failed; final retry gave empty response",
|
kafka.logger.Warn("every function invocation retry failed; final retry gave empty response",
|
||||||
zap.String("function_url", url),
|
zap.String("function_url", url),
|
||||||
zap.String("trigger", trigger.Metadata.Name))
|
zap.String("trigger", trigger.Metadata.Name))
|
||||||
return false
|
return
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
@@ -283,12 +281,12 @@ func kafkaMsgHandler(kafka *Kafka, producer sarama.SyncProducer, trigger *fv1.Me
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
errorHandler(kafka.logger, trigger, producer, url,
|
errorHandler(kafka.logger, trigger, producer, url,
|
||||||
errors.Wrapf(err, "request body error: %v", string(body)))
|
errors.Wrapf(err, "request body error: %v", string(body)))
|
||||||
return false
|
return
|
||||||
}
|
}
|
||||||
if resp.StatusCode != 200 {
|
if resp.StatusCode != 200 {
|
||||||
errorHandler(kafka.logger, trigger, producer, url,
|
errorHandler(kafka.logger, trigger, producer, url,
|
||||||
fmt.Errorf("request returned failure: %v", resp.StatusCode))
|
fmt.Errorf("request returned failure: %v", resp.StatusCode))
|
||||||
return false
|
return
|
||||||
}
|
}
|
||||||
if len(trigger.Spec.ResponseTopic) > 0 {
|
if len(trigger.Spec.ResponseTopic) > 0 {
|
||||||
// Generate Kafka record headers
|
// Generate Kafka record headers
|
||||||
@@ -315,10 +313,10 @@ func kafkaMsgHandler(kafka *Kafka, producer sarama.SyncProducer, trigger *fv1.Me
|
|||||||
zap.Error(err),
|
zap.Error(err),
|
||||||
zap.String("topic", trigger.Spec.Topic),
|
zap.String("topic", trigger.Spec.Topic),
|
||||||
zap.String("function_url", url))
|
zap.String("function_url", url))
|
||||||
return false
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
consumer.MarkOffset(msg, "") // mark message as processed
|
||||||
}
|
}
|
||||||
|
|
||||||
func errorHandler(logger *zap.Logger, trigger *fv1.MessageQueueTrigger, producer sarama.SyncProducer, funcUrl string, err error) {
|
func errorHandler(logger *zap.Logger, trigger *fv1.MessageQueueTrigger, producer sarama.SyncProducer, funcUrl string, err error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user