gitee.com/woood2/luca@v1.0.4/internal/producer/sarama_producer.go (about) 1 package producer 2 3 import ( 4 "context" 5 "gitee.com/woood2/luca/internal/conf" 6 "github.com/Shopify/sarama" 7 "github.com/openzipkin/zipkin-go" 8 "go.uber.org/zap" 9 "log" 10 ) 11 12 var globalProducer *Producer 13 14 func SetG(p *Producer) { 15 globalProducer = p 16 } 17 18 func G() *Producer { 19 return globalProducer 20 } 21 22 func New(c *conf.Kafka, zapLogger *zap.Logger) *Producer { 23 conf := sarama.NewConfig() 24 conf.Producer.Return.Successes = true 25 conf.Producer.RequiredAcks = sarama.WaitForLocal 26 27 //version 28 version, err := sarama.ParseKafkaVersion(c.Version) 29 if err != nil { 30 log.Panicf("Error parsing Kafka version: %v", err) 31 } 32 conf.Version = version 33 //SASL 34 if c.EnableSASL { 35 conf.Net.SASL.Enable = c.EnableSASL 36 conf.Net.SASL.User = c.User 37 conf.Net.SASL.Password = c.Password 38 conf.Net.SASL.Handshake = true 39 if c.Algorithm == "sha512" { 40 conf.Net.SASL.SCRAMClientGeneratorFunc = func() sarama.SCRAMClient { return &XDGSCRAMClient{HashGeneratorFcn: SHA512} } 41 conf.Net.SASL.Mechanism = sarama.SASLTypeSCRAMSHA512 42 } else if c.Algorithm == "sha256" { 43 conf.Net.SASL.SCRAMClientGeneratorFunc = func() sarama.SCRAMClient { return &XDGSCRAMClient{HashGeneratorFcn: SHA256} } 44 conf.Net.SASL.Mechanism = sarama.SASLTypeSCRAMSHA256 45 } else { 46 log.Panicf("invalid SHA algorithm \"%s\": can be either \"sha256\" or \"sha512\"\n", c.Algorithm) 47 } 48 } 49 p, e := sarama.NewSyncProducer(c.Brokers, conf) 50 if e != nil { 51 log.Panicln(err) 52 } 53 return &Producer{ 54 syncProducer: p, 55 logger: zapLogger.WithOptions(zap.AddCallerSkip(1)), 56 } 57 } 58 59 type Producer struct { 60 syncProducer sarama.SyncProducer 61 logger *zap.Logger 62 } 63 64 func (p *Producer) SendMessage(ctx context.Context, value Msg) error { 65 topic := value.Topic() 66 msg := &sarama.ProducerMessage{Topic: topic, Value: value} 67 partition, offset, err := p.syncProducer.SendMessage(msg) 68 traceID := zipkin.SpanFromContext(ctx).Context().TraceID.String() 69 if err != nil { 70 p.logger.Error("FAILED to send message", 71 zap.String("topic", topic), 72 zap.Any("err", err), 73 zap.String("traceID", traceID), 74 ) 75 } else { 76 p.logger.Debug("> message sent", 77 zap.String("topic", topic), 78 zap.Int32("partition", partition), 79 zap.Int64("offset", offset), 80 zap.String("traceID", traceID), 81 ) 82 } 83 return err 84 } 85 86 func (p *Producer) Close() { 87 if err := p.syncProducer.Close(); err != nil { 88 log.Println(err) 89 } 90 } 91 92 type Msg interface { 93 Encode() ([]byte, error) 94 Length() int 95 Topic() string 96 Decode(data []byte) error 97 }