未验证 提交 a3c17604 编写于 作者: E Enwei Jiao 提交者: GitHub

Fix kafka producer init many times (#26314)

Signed-off-by: NEnwei Jiao <enwei.jiao@zilliz.com>
上级 83910593
...@@ -6,16 +6,21 @@ import ( ...@@ -6,16 +6,21 @@ import (
"sync" "sync"
"github.com/confluentinc/confluent-kafka-go/kafka" "github.com/confluentinc/confluent-kafka-go/kafka"
"go.uber.org/atomic"
"go.uber.org/zap" "go.uber.org/zap"
"github.com/milvus-io/milvus/pkg/log" "github.com/milvus-io/milvus/pkg/log"
"github.com/milvus-io/milvus/pkg/metrics" "github.com/milvus-io/milvus/pkg/metrics"
"github.com/milvus-io/milvus/pkg/mq/msgstream/mqwrapper" "github.com/milvus-io/milvus/pkg/mq/msgstream/mqwrapper"
"github.com/milvus-io/milvus/pkg/util/conc"
"github.com/milvus-io/milvus/pkg/util/paramtable" "github.com/milvus-io/milvus/pkg/util/paramtable"
"github.com/milvus-io/milvus/pkg/util/timerecord" "github.com/milvus-io/milvus/pkg/util/timerecord"
) )
var producer *kafka.Producer var (
producer atomic.Pointer[kafka.Producer]
sf conc.Singleflight[*kafka.Producer]
)
var once sync.Once var once sync.Once
...@@ -85,15 +90,21 @@ func cloneKafkaConfig(config kafka.ConfigMap) *kafka.ConfigMap { ...@@ -85,15 +90,21 @@ func cloneKafkaConfig(config kafka.ConfigMap) *kafka.ConfigMap {
} }
func (kc *kafkaClient) getKafkaProducer() (*kafka.Producer, error) { func (kc *kafkaClient) getKafkaProducer() (*kafka.Producer, error) {
config := kc.newProducerConfig() if p := producer.Load(); p != nil {
producer, err := kafka.NewProducer(config) return p, nil
if err != nil {
log.Error("create sync kafka producer failed", zap.Error(err))
return nil, err
} }
once.Do(func() { p, err, _ := sf.Do("kafka_producer", func() (*kafka.Producer, error) {
if p := producer.Load(); p != nil {
return p, nil
}
config := kc.newProducerConfig()
p, err := kafka.NewProducer(config)
if err != nil {
log.Error("create sync kafka producer failed", zap.Error(err))
return nil, err
}
go func() { go func() {
for e := range producer.Events() { for e := range p.Events() {
switch ev := e.(type) { switch ev := e.(type) {
case kafka.Error: case kafka.Error:
// Generic client instance-level errors, such as broker connection failures, // Generic client instance-level errors, such as broker connection failures,
...@@ -109,9 +120,13 @@ func (kc *kafkaClient) getKafkaProducer() (*kafka.Producer, error) { ...@@ -109,9 +120,13 @@ func (kc *kafkaClient) getKafkaProducer() (*kafka.Producer, error) {
} }
} }
}() }()
producer.Store(p)
return p, nil
}) })
if err != nil {
return producer, nil return nil, err
}
return p, nil
} }
func (kc *kafkaClient) newProducerConfig() *kafka.ConfigMap { func (kc *kafkaClient) newProducerConfig() *kafka.ConfigMap {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册