api-platform/internal/service/stream/producer.go
2024-11-21 19:25:32 +08:00

120 lines
2.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package stream
import (
"context"
"github.com/segmentio/kafka-go"
"go-template/internal/schema"
"time"
)
//var connections = map[string]*kafka.Conn{}
//func (s *Service) dial(topic string) (*kafka.Conn, error) {
//
// // 如果topic 存在于 connections 则直接返回
// if conn, ok := connections[topic]; ok {
// return conn, nil
// }
//
// ctx := context.Background()
//
// conn, err := kafka.DialLeader(ctx, "tcp", s.config.Kafka.BootstrapServers[0], s.topic(topic), 0)
// if err != nil {
// return nil, err
// }
// //err = conn.SetWriteDeadline(time.Now().Add(10 * time.Second))
// //if err != nil {
// // return conn, err
// //}
// //
// //// set read deadline
// //err = conn.SetReadDeadline(time.Now().Add(10 * time.Second))
// //if err != nil {
// // return conn, err
// //}
//
// connections[topic] = conn
//
// return conn, nil
//}
//
//func (s *Service) Publish(topic string, message ...[]byte) error {
// conn, err := s.dial(topic)
// if err != nil {
// return err
// }
//
// msg := make([]kafka.Message, len(message))
// for i, v := range message {
// msg[i] = kafka.Message{Value: v}
// }
//
// _, err = conn.WriteMessages(msg...)
//
// return err
//}
func (s *Service) Producer(topic string) *kafka.Writer {
var w = &kafka.Writer{
Addr: kafka.TCP(s.config.Kafka.BootstrapServers...),
Topic: topic,
Balancer: &kafka.Hash{}, // 用于对key进行hash决定消息发送到哪个分区
MaxAttempts: 0,
WriteBackoffMin: 0,
WriteBackoffMax: 0,
BatchSize: 0,
BatchBytes: 0,
BatchTimeout: 0,
ReadTimeout: 0,
//WriteTimeout: time.Second, // kafka有时候可能负载很高写不进去那么超时后可以放弃写入用于可以丢消息的场景
RequiredAcks: kafka.RequireAll, // 不需要任何节点确认就返回
Async: true,
Completion: nil,
Compression: 0,
Logger: nil,
ErrorLogger: nil,
Transport: nil,
AllowAutoTopicCreation: false, // 第一次发消息的时候如果topic不存在就自动创建topic工作中禁止使用
}
if s.config.Kafka.Username != "" && s.config.Kafka.Password != "" {
w.Transport = &kafka.Transport{
SASL: s.auth(),
}
}
return w
}
func (s *Service) SendMessage(ctx context.Context, topic string, data []byte) error {
msg := kafka.Message{
Partition: 0,
Offset: 0,
HighWaterMark: 0,
//Key: key,
Value: data,
Time: time.Time{},
}
err := s.Producer(topic).WriteMessages(ctx, msg)
return err
}
func (s *Service) SendEvent(ctx context.Context, topic string, data schema.EventMessage) error {
j, err := data.JSON()
if err != nil {
return err
}
msg := kafka.Message{
Partition: 0,
Offset: 0,
HighWaterMark: 0,
Value: j,
Time: time.Time{},
}
err = s.Producer(topic).WriteMessages(ctx, msg)
return err
}