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  }