main
parent
b8e469c8da
commit
a8959b1b0b
4 changed files with 173 additions and 34 deletions
@ -0,0 +1,27 @@ |
|||||||
|
package kafka |
||||||
|
|
||||||
|
import ( |
||||||
|
"github.com/segmentio/kafka-go" |
||||||
|
) |
||||||
|
|
||||||
|
type KafkaReader struct { |
||||||
|
reader *kafka.Reader |
||||||
|
} |
||||||
|
|
||||||
|
func NewReader(topic string, address ...string) *KafkaReader { |
||||||
|
return &KafkaReader{ |
||||||
|
// reader: &kafka.Reader{
|
||||||
|
// Topic: topic,
|
||||||
|
// Balancer: &kafka.LeastBytes{},
|
||||||
|
// Addr: kafka.TCP(address...),
|
||||||
|
// },
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func (s *KafkaReader) Close() error { |
||||||
|
return s.reader.Close() |
||||||
|
} |
||||||
|
|
||||||
|
func (s *KafkaReader) ReadMessage(key string, value string) error { |
||||||
|
return nil |
||||||
|
} |
@ -0,0 +1,117 @@ |
|||||||
|
package kafka |
||||||
|
|
||||||
|
import ( |
||||||
|
"context" |
||||||
|
"log" |
||||||
|
"net" |
||||||
|
"strconv" |
||||||
|
|
||||||
|
"github.com/segmentio/kafka-go" |
||||||
|
) |
||||||
|
|
||||||
|
type KafkaWriter struct { |
||||||
|
writer *kafka.Writer |
||||||
|
first string |
||||||
|
topic string |
||||||
|
} |
||||||
|
|
||||||
|
func NewWriter(topic string, address ...string) *KafkaWriter { |
||||||
|
s := &KafkaWriter{ |
||||||
|
writer: &kafka.Writer{ |
||||||
|
Topic: topic, |
||||||
|
Balancer: &kafka.LeastBytes{}, |
||||||
|
Addr: kafka.TCP(address...), |
||||||
|
}, |
||||||
|
first: address[0], |
||||||
|
topic: topic, |
||||||
|
} |
||||||
|
|
||||||
|
// Приверим и при необходимости создадим топик
|
||||||
|
era := s.checkTopic() |
||||||
|
if era != nil { |
||||||
|
log.Fatal(era) |
||||||
|
} |
||||||
|
|
||||||
|
return s |
||||||
|
} |
||||||
|
|
||||||
|
func (s *KafkaWriter) Close() error { |
||||||
|
return s.writer.Close() |
||||||
|
} |
||||||
|
|
||||||
|
func (s *KafkaWriter) fetchTopics() (map[string]bool, error) { |
||||||
|
conn, err := kafka.Dial("tcp", s.first) |
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
defer conn.Close() |
||||||
|
|
||||||
|
//
|
||||||
|
partitions, erp := conn.ReadPartitions() |
||||||
|
if erp != nil { |
||||||
|
return nil, erp |
||||||
|
} |
||||||
|
|
||||||
|
//
|
||||||
|
topics := make(map[string]bool) |
||||||
|
for _, p := range partitions { |
||||||
|
topics[p.Topic] = true |
||||||
|
} |
||||||
|
|
||||||
|
return topics, nil |
||||||
|
} |
||||||
|
|
||||||
|
func (s *KafkaWriter) createTopic() error { |
||||||
|
conn, err := kafka.Dial("tcp", s.first) |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
defer conn.Close() |
||||||
|
|
||||||
|
//
|
||||||
|
controller, era := conn.Controller() |
||||||
|
if era != nil { |
||||||
|
return era |
||||||
|
} |
||||||
|
|
||||||
|
//
|
||||||
|
controllerConn, eru := kafka.Dial("tcp", net.JoinHostPort(controller.Host, strconv.Itoa(controller.Port))) |
||||||
|
if eru != nil { |
||||||
|
return eru |
||||||
|
} |
||||||
|
defer controllerConn.Close() |
||||||
|
|
||||||
|
//
|
||||||
|
topicConfigs := []kafka.TopicConfig{ |
||||||
|
{ |
||||||
|
Topic: s.topic, |
||||||
|
NumPartitions: 1, |
||||||
|
ReplicationFactor: 1, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
return controllerConn.CreateTopics(topicConfigs...) |
||||||
|
} |
||||||
|
|
||||||
|
func (s *KafkaWriter) checkTopic() error { |
||||||
|
topics, err := s.fetchTopics() |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
// Если топика нет, то создадим
|
||||||
|
if _, ok := topics[s.topic]; !ok { |
||||||
|
return s.createTopic() |
||||||
|
} |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (s *KafkaWriter) WriteMessage(key string, value string) error { |
||||||
|
err := s.writer.WriteMessages(context.Background(), kafka.Message{ |
||||||
|
Key: []byte(key), |
||||||
|
Value: []byte(value), |
||||||
|
}) |
||||||
|
|
||||||
|
return err |
||||||
|
} |
Loading…
Reference in new issue