56 lines
1.4 KiB
Go
56 lines
1.4 KiB
Go
package kafka
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"fiskerinc.com/modules/utils/envtool"
|
|
|
|
"github.com/confluentinc/confluent-kafka-go/v2/kafka"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// AdminClient interface
|
|
type AdminClient interface {
|
|
CreateTopics(ctx context.Context, topics []kafka.TopicSpecification, options ...kafka.CreateTopicsAdminOption) ([]kafka.TopicResult, error)
|
|
}
|
|
|
|
// Global
|
|
var (
|
|
Admin AdminClient
|
|
kafkaHosts string = envtool.GetEnv("KAFKA_HOSTS", "localhost:9093")
|
|
)
|
|
|
|
func init() {
|
|
Admin, _ = kafka.NewAdminClient(&kafka.ConfigMap{"bootstrap.servers": kafkaHosts})
|
|
}
|
|
|
|
// EnsureTopicsExist checks Kafka for topic, if it doesn't exist it creates topic
|
|
func EnsureTopicsExist(topics []string) error {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
|
|
s := fmt.Sprintf("%vs", envtool.GetEnvInt("KAFKA_TIMEOUT", 30))
|
|
maxDur, err := time.ParseDuration(s)
|
|
if err != nil {
|
|
return errors.WithStack(err)
|
|
}
|
|
|
|
ts := make([]kafka.TopicSpecification, len(topics))
|
|
for i, t := range topics {
|
|
ts[i] = kafka.TopicSpecification{
|
|
Topic: t,
|
|
NumPartitions: envtool.GetEnvInt("KAFKA_TOPIC_PARTITIONS", 1),
|
|
ReplicationFactor: envtool.GetEnvInt("KAFKA_TOPIC_REPLICATION_FACTOR", 1),
|
|
}
|
|
}
|
|
|
|
_, err = Admin.CreateTopics(ctx, ts, kafka.SetAdminOperationTimeout(maxDur))
|
|
if err != nil {
|
|
return errors.WithStack(err)
|
|
}
|
|
|
|
return nil
|
|
}
|