Apache Pulsar Go

  1. 使用docker开启一个Pulsar服务
docker run -d -p 6650:6650 -p 8080:8080 apachepulsar/pulsar:latest bin/pulsar standalone

在Go 中使用Apache

1. 安装依赖
go get github.com/apache/pulsar-client-go/pulsar
2. 创建角色(生产者,消费者,读取器)
a. 生产者
    • 绑定url
    • 使用Topic确定主题
    • 发送字节数据
    • 根据发送消息的报错,来判断消息是否发送成功
// 生产者(用于发送消息到队列)
func TestProducer(t *testing.T) {
	client, err := pulsar.NewClient(pulsar.ClientOptions{
		URL: "pulsar://60.204.241.30:6650",
	})

	defer client.Close()

	producer, err := client.CreateProducer(pulsar.ProducerOptions{
		Topic: "my-topic",
	})

	_, err = producer.Send(context.Background(), &pulsar.ProducerMessage{
		Payload: []byte("11111111"),
	})

	defer producer.Close()

	if err != nil {
		fmt.Println("Failed to publish message", err)
	} else {
		fmt.Println("Published message")
	}
}
b. 消费者
    • 用于接受消息并选择是否确认
    • 订阅消息的主题
    • 设置自己的订阅者名称(使用不同的订阅者名称防止消息的争抢)
// 消费者(读取消息,并选择是否要确认消息)
func TestConsumer(t *testing.T) {
	client, err := pulsar.NewClient(pulsar.ClientOptions{
		URL: "pulsar://60.204.241.30:6650",
	})

	if err != nil {
		log.Fatal(err)
	}

	defer client.Close()

	consumer, err := client.Subscribe(pulsar.ConsumerOptions{
		Topic:            "my-topic",
		SubscriptionName: "my-sub",
		Type:             pulsar.Shared,
	})

	defer consumer.Close()
	// 获取消息
	for {
		msg, err := consumer.Receive(context.Background())
		if err != nil {
			log.Fatal(err)
		}

		payload := msg.Payload()

		fmt.Printf("Received message msgId: %#v -- content: '%s'\n", msg.ID(), string(payload))
		err = consumer.Ack(msg)
		if err != nil {
			log.Fatal(err)
		}
	}
}
  • 订阅者的类型(Type)
    • Exclusive consumers(独占消费者)👆默认
      • 消费者一对一消费一个队列,其他的消费者不能订阅这个队列,直到这个消费者挂掉
    • Shared consumers(共享消费者)
      • 多个消费者可以共享一个队列,前提是你们的名称(SubscriptionName)不一样,名称一样的话视为同一个消费者
    • Failover consumers(失败重试消费者)
      • 类似于独占消费者,如果主消费者挂掉了就会选择一个从消费者来接受消息
  • 订阅者确认消息
    • 订阅者要对消息进行确认,不确认的话,消息依旧是未读状态
    • 重启这个消费者,依旧会接受到未读的所有消息
    • Shared consumers(共享消费者)的状态下面,不同的消费者不接受的消息不回影响其他的消费者,也就是自己收自己的,互不干扰
c. 读取器
    • 绑定服务端
    • client.CreateReader创建
    • 循环读取消息,包括确认掉的消息都会读取过来
    • StartMessageID这个设置消息从这个id开始读取(消息格式一般是14:28:0)使用pulsar.EarliestMessageID()直接读取最开始的消息

// 读取器(读取所有的消息,包括确认的消息)
func TestReader(t *testing.T) {
	client, err := pulsar.NewClient(pulsar.ClientOptions{URL: "pulsar://60.204.241.30:6650"})
	if err != nil {
		log.Fatal(err)
	}

	defer client.Close()

	reader, err := client.CreateReader(pulsar.ReaderOptions{
		Topic:          "my-topic",
		StartMessageID: pulsar.EarliestMessageID(),
	})
	if err != nil {
		log.Fatal(err)
	}
	defer reader.Close()

	for reader.HasNext() {
		msg, err := reader.Next(context.Background())
		if err != nil {
			log.Fatal(err)
		}

		fmt.Printf("Received message msgId: %#v -- content: '%s'\n",
			msg.ID(), string(msg.Payload()))
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值