30 lines
1.2 KiB
Go
30 lines
1.2 KiB
Go
package queue
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/segmentio/kafka-go"
|
|
)
|
|
|
|
type Producer struct{ w *kafka.Writer }
|
|
|
|
func NewProducer(brokers []string, topic string) *Producer {
|
|
return &Producer{w: &kafka.Writer{Addr: kafka.TCP(brokers...), Topic: topic, Balancer: &kafka.Hash{}, BatchSize: 100, BatchTimeout: 10 * time.Millisecond, RequiredAcks: kafka.RequireAll, Async: false}}
|
|
}
|
|
func (p *Producer) Write(ctx context.Context, key string, value []byte) error {
|
|
return p.w.WriteMessages(ctx, kafka.Message{Key: []byte(key), Value: value, Time: time.Now().UTC()})
|
|
}
|
|
func (p *Producer) Close() error { return p.w.Close() }
|
|
|
|
type Consumer struct{ r *kafka.Reader }
|
|
|
|
func NewConsumer(brokers []string, topic, group string) *Consumer {
|
|
return &Consumer{r: kafka.NewReader(kafka.ReaderConfig{Brokers: brokers, Topic: topic, GroupID: group, MinBytes: 1e3, MaxBytes: 16e6, MaxWait: 500 * time.Millisecond, CommitInterval: 0})}
|
|
}
|
|
func (c *Consumer) Fetch(ctx context.Context) (kafka.Message, error) { return c.r.FetchMessage(ctx) }
|
|
func (c *Consumer) Commit(ctx context.Context, m kafka.Message) error {
|
|
return c.r.CommitMessages(ctx, m)
|
|
}
|
|
func (c *Consumer) Close() error { return c.r.Close() }
|