Go kafka

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/Shopify/sarama"
)

const (
	TOPIC  = "lotsof"
	KAFKA1 = "localhost:9092"
	KAFKA2 = "localhost:9093"
)

func main() {
	异步生产者()
}

type 消费组Handler struct {
}

func (消费组Handler) Setup(sarama.ConsumerGroupSession) error   { return nil }
func (消费组Handler) Cleanup(sarama.ConsumerGroupSession) error { return nil }

// ConsumeClaim must start a consumer loop of ConsumerGroupClaim's Messages().
func (消费组Handler) ConsumeClaim(session sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {
	for msg := range claim.Messages() {
		log.Printf("Message claimed: value = %s, timestamp = %v, topic = %s", msg.Value, msg.Timestamp, msg.Topic)
		session.MarkMessage(msg, "")
	}
	return nil
}

func 消费组() {

	config := sarama.NewConfig()
	config.Consumer.Return.Errors = false
	config.Version = sarama.V0_10_2_0                     // specify appropriate version
	config.Consumer.Offsets.Initial = sarama.OffsetOldest // 消费位置 也可以是 OffsetNewest

	group, err := sarama.NewConsumerGroup([]string{KAFKA1, KAFKA2}, "my-group", config)
	if err != nil {
		panic(err)
	}
	defer group.Close()

	fmt.Println("Consumed start")
	ctx := context.Background()
	for {
		topics := []string{TOPIC}

		handler := 消费组Handler{}

		err := group.Consume(ctx, topics, handler)
		if err != nil {
			panic(err)
		}
	}
}

func 同步生产者() {
	producer, err := sarama.NewSyncProducer([]string{KAFKA1, KAFKA2}, nil)
	if err != nil {
		log.Fatalln(err)
	}
	defer producer.Close()

	msg := &sarama.ProducerMessage{
		Topic: TOPIC,
		Value: sarama.StringEncoder("testing 123"),
	}

	// 发送一个 消息
	partition, offset, err := producer.SendMessage(msg)
	if err != nil {
		log.Printf("FAILED to send message: %s\n", err)
	} else {
		log.Printf("> 消息发送成功:message sent to partition %d at offset %d\n", partition, offset)
	}
}

func 异步生产者() {
	config := sarama.NewConfig()
	config.Producer.Return.Successes = true
	config.Producer.Return.Errors = true
	producer, err := sarama.NewAsyncProducer([]string{KAFKA1, KAFKA2}, config)

	if err != nil {
		panic(err)
	}

	message := &sarama.ProducerMessage{Topic: TOPIC, Value: sarama.StringEncoder("message is 123321")}

	// 此步骤 会新开一个 channel 进行信息发送
	producer.Input() <- message
	// 所以 要先 看 发送的 状态,要写一个定时器 等一会
	time.Sleep(2 * time.Second)

	select {
	case res := <-producer.Successes(): //可理解为 成功的回调
		fmt.Printf("%T---%+v\n", res, res)
	case err := <-producer.Errors(): //可理解为 失败的回调
		fmt.Printf("%T---%+v\n", err, err)
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值