openreplay/ee/backend/pkg/kafka/producer.go
2021-05-03 17:53:25 +02:00

51 lines
1.1 KiB
Go

package kafka
import (
"log"
"openreplay/backend/pkg/env"
"gopkg.in/confluentinc/confluent-kafka-go.v1/kafka"
)
type Producer struct {
producer *kafka.Producer
}
func NewProducer() *Producer {
protocol := "plaintext"
if env.Bool("KAFKA_USE_SSL") {
protocol = "ssl"
}
producer, err := kafka.NewProducer(&kafka.ConfigMap{
"enable.idempotence": true, // TODO: get rid of
"bootstrap.servers": env.String("KAFKA_SERVERS"),
"go.delivery.reports": false,
"security.protocol": protocol,
"go.batch.producer": true,
"queue.buffering.max.ms": 100,
})
if err != nil {
log.Fatalln(err)
}
return &Producer{producer}
}
func (p *Producer) Produce(topic string, key uint64, value []byte) error {
p.producer.ProduceChannel() <- &kafka.Message{
TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: getKeyPartition(key)},
Key: encodeKey(key),
Value: value,
}
return nil
}
func (p *Producer) Close(timeoutMs int) {
p.producer.Flush(timeoutMs)
p.producer.Close()
}
func (p *Producer) Flush(timeoutMs int) {
p.producer.Flush(timeoutMs)
}
// MBTODO: GetFatalError check