81 lines
2.1 KiB
Go
81 lines
2.1 KiB
Go
package kafka
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/Shopify/sarama"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
func SaramaSyncProducer() (sarama.AsyncProducer, error) {
|
|
return sarama.NewAsyncProducer(strings.Split(viper.GetString("kafka.brokers"), ","), kafkaProducerConfig())
|
|
}
|
|
|
|
func SaramaKafkaConsumer(groupID string) (sarama.ConsumerGroup, error) {
|
|
consumerGroup, err := sarama.NewConsumerGroup(strings.Split(viper.GetString("kafka.brokers"), ","), groupID, kafkaConsumerConfig(groupID))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return consumerGroup, nil
|
|
}
|
|
|
|
func kafkaProducerConfig() *sarama.Config {
|
|
config := kafkaConfig()
|
|
|
|
config.Producer.Retry.Max = 3
|
|
config.Producer.RequiredAcks = sarama.WaitForLocal
|
|
config.Producer.Compression = sarama.CompressionSnappy
|
|
config.Producer.Return.Successes = true
|
|
config.Producer.Flush.Bytes = 100
|
|
config.Producer.Flush.Frequency = 100
|
|
config.Producer.Flush.Messages = 100
|
|
config.Producer.Flush.MaxMessages = 100
|
|
|
|
config.Metadata.RefreshFrequency = 1 * time.Minute
|
|
|
|
return config
|
|
}
|
|
|
|
func kafkaConsumerConfig(groupId string) *sarama.Config {
|
|
config := kafkaConfig()
|
|
|
|
config.Version = sarama.V3_3_1_0
|
|
config.Consumer.Offsets.Initial = sarama.OffsetNewest
|
|
config.Consumer.Return.Errors = true
|
|
config.ClientID = groupId
|
|
config.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategyRoundRobin
|
|
|
|
return config
|
|
}
|
|
|
|
func kafkaConfig() *sarama.Config {
|
|
config := sarama.NewConfig()
|
|
env := viper.GetString("env")
|
|
|
|
if env == "local" {
|
|
return config
|
|
}
|
|
|
|
if env == "prod" {
|
|
config.Net.SASL.Mechanism = sarama.SASLTypePlaintext
|
|
} else {
|
|
config.Net.SASL.Mechanism = sarama.SASLTypeSCRAMSHA512
|
|
config.Net.SASL.SCRAMClientGeneratorFunc = func() sarama.SCRAMClient {
|
|
return &XDGSCRAMClient{HashGeneratorFcn: SHA512}
|
|
}
|
|
}
|
|
|
|
config.Net.SASL.User = viper.GetString("kafka.username")
|
|
config.Net.SASL.Password = viper.GetString("kafka.password")
|
|
config.Net.SASL.Enable = viper.GetBool("kafka.sasl.enabled")
|
|
config.Net.TLS.Enable = viper.GetBool("kafka.tls.enabled")
|
|
config.Net.TLS.Config = &tls.Config{
|
|
InsecureSkipVerify: viper.GetBool("kafka.tls.insecureSkipVerify"),
|
|
}
|
|
|
|
return config
|
|
}
|