69 lines
1.7 KiB
Go
69 lines
1.7 KiB
Go
package stream
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"github.com/segmentio/kafka-go"
|
||
"time"
|
||
)
|
||
|
||
//func (s *Service) Listen(topic string, handler HandlerFunc) error {
|
||
// conn, err := s.dial(topic)
|
||
// if err != nil {
|
||
// return err
|
||
// }
|
||
//
|
||
// batch := conn.ReadBatch(10e3, 1e6) // fetch 10KB min, 1MB max
|
||
//
|
||
// b := make([]byte, 10e3) // 10KB max per message
|
||
// for {
|
||
// n, err := batch.Read(b)
|
||
// if err != nil {
|
||
// return err
|
||
// }
|
||
// handler(b[:n])
|
||
// }
|
||
//}
|
||
|
||
func (s *Service) Consumer(topic string, groupId string) *kafka.Reader {
|
||
var r = kafka.ReaderConfig{
|
||
Brokers: s.config.Kafka.BootstrapServers,
|
||
GroupID: groupId,
|
||
GroupTopics: nil,
|
||
Topic: topic,
|
||
CommitInterval: time.Second,
|
||
//StartOffset: kafka., // 仅对新创建的消费者组生效,从头开始消费,工作中可能更常用从最新的开始消费kafka.LastOffset
|
||
Logger: nil,
|
||
ErrorLogger: nil,
|
||
IsolationLevel: 0,
|
||
MaxAttempts: 0,
|
||
OffsetOutOfRangeError: false,
|
||
MaxBytes: 10e6, // 10MB
|
||
}
|
||
|
||
if s.config.Kafka.Username != "" && s.config.Kafka.Password != "" {
|
||
r.Dialer = &kafka.Dialer{
|
||
Timeout: 10 * time.Second,
|
||
DualStack: true,
|
||
SASLMechanism: s.auth(),
|
||
}
|
||
}
|
||
|
||
return kafka.NewReader(r)
|
||
|
||
}
|
||
|
||
type HandlerFunc func([]byte)
|
||
|
||
// ReadMessage 消费消息
|
||
func (s *Service) ReadMessage(ctx context.Context, topic string, groupId string) {
|
||
for {
|
||
if msg, err := s.Consumer(topic, groupId).ReadMessage(ctx); err != nil {
|
||
fmt.Println(fmt.Sprintf("读kafka失败,err:%v", err))
|
||
continue
|
||
} else {
|
||
fmt.Println(fmt.Sprintf("topic=%s,partition=%d,offset=%d,key=%s,value=%s", msg.Topic, msg.Partition, msg.Offset, msg.Key, msg.Value))
|
||
}
|
||
}
|
||
}
|