day09-Go语言与三种消息队列:Kafka、RocketMQ、VerneMQ | 青训营笔记

318 阅读3分钟

本次笔记是对三种消息队列(Kafka、RocketMQ、VerneMQ)的简介以及如何在Go语言中使用它们的说明:

1. Kafka:

  1. Kafka是一个分布式流处理平台,具有高吞吐量、可持久化存储和容错性等特点。
  2. 使用Kafka可以将消息发布到主题(Topic),然后消费者可以订阅这些主题并处理消息。
  3. 在Go语言中使用Kafka,可以使用第三方库如Sarama来实现与Kafka的交互。Sarama提供了用于生产者和消费者的API,以便发送和接收消息。

使用Sarama库与Kafka进行交互示例代码:

package main

import (
	"log"

	"github.com/Shopify/sarama"
)

func main() {
	// 创建Kafka生产者配置
	config := sarama.NewConfig()
	config.Producer.Return.Successes = true

	// 创建Kafka生产者
	producer, err := sarama.NewSyncProducer([]string{"localhost:9092"}, config)
	if err != nil {
		log.Fatal("Failed to create Kafka producer:", err)
	}
	defer producer.Close()

	// 发送消息到Kafka主题
	msg := &sarama.ProducerMessage{
		Topic: "my_topic",
		Value: sarama.StringEncoder("Hello, Kafka!"),
	}

	partition, offset, err := producer.SendMessage(msg)
	if err != nil {
		log.Fatal("Failed to send message:", err)
	}

	log.Printf("Message sent successfully! Partition: %d, Offset: %d\n", partition, offset)
}

2. RocketMQ:

  1. RocketMQ是一个分布式消息和流式处理平台,具有高性能、可伸缩性和容错性。
  2. RocketMQ支持顺序消息、事务消息和广播消息等多种消息模式。
  3. 在Go语言中使用RocketMQ,可以使用第三方库如apache/rocketmq-client-go来与RocketMQ进行交互。该库提供了生产者和消费者的API,以发送和接收消息。

在Go语言中使用第三方库apache/rocketmq-client-go与RocketMQ进行交互,你需要先安装该库,go get github.com/apache/rocketmq-client-go/v2 并按照以下示例进行配置和代码编写:

1、编写生产者代码:创建RocketMQ生产者,并发送消息到指定的主题。在创建生产者实例时,需要指定NameServer的地址。然后,使用SendSync方法发送同步消息:

package main

import (
	"log"

	"github.com/apache/rocketmq-client-go/v2"
	"github.com/apache/rocketmq-client-go/v2/primitive"
)

func main() {
	// 创建RocketMQ生产者实例
	p, err := rocketmq.NewProducer(
		rocketmq.WithNameServer([]string{"localhost:9876"}),
	)
	if err != nil {
		log.Fatal("Failed to create RocketMQ producer:", err)
	}
	defer p.Shutdown()

	// 启动生产者
	err = p.Start()
	if err != nil {
		log.Fatal("Failed to start RocketMQ producer:", err)
	}

	// 发送消息到指定主题
	msg := &primitive.Message{
		Topic: "my_topic",
		Body:  []byte("Hello, RocketMQ!"),
	}

	result, err := p.SendSync(rocketmq.NewMessage(msg))
	if err != nil {
		log.Fatal("Failed to send message:", err)
	}

	log.Printf("Message sent successfully! MessageID: %s\n", result.MsgID)
}

2、编写消费者代码:创建RocketMQ消费者,并订阅指定主题的消息。在创建消费者实例时,也需要指定NameServer的地址。然后,使用Subscribe方法订阅主题,并在回调函数中处理接收到的消息:

package main

import (
	"log"

	"github.com/apache/rocketmq-client-go/v2"
	"github.com/apache/rocketmq-client-go/v2/consumer"
	"github.com/apache/rocketmq-client-go/v2/primitive"
)

func main() {
	// 创建RocketMQ消费者实例
	c, err := rocketmq.NewPushConsumer(
		consumer.WithNameServer([]string{"localhost:9876"}),
	)
	if err != nil {
		log.Fatal("Failed to create RocketMQ consumer:", err)
	}
	defer c.Shutdown()

	// 订阅指定主题的消息
	err = c.Subscribe("my_topic", consumer.MessageSelector{}, func(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
		for _, msg := range msgs {
			log.Printf("Received message: %s\n", string(msg.Body))
		}
		return consumer.ConsumeSuccess, nil
	})
	if err != nil {
		log.Fatal("Failed to subscribe to topic:", err)
	}

	// 启动消费者
	err = c.Start()
	if err != nil {
		log.Fatal("Failed to start RocketMQ consumer:", err)
	}

	// 阻塞主线程
	select {}
}

3. VerneMQ:不常用

  1. VerneMQ是一个开源的分布式MQTT消息代理,用于构建可扩展的物联网和实时应用。
  2. VerneMQ支持高并发、持久化存储、多种QoS级别和集群功能等特性。
  3. 在Go语言中使用VerneMQ,可以使用第三方库如eclipse/paho.mqtt.golang来实现与VerneMQ的交互。该库提供了MQTT客户端的API,可用于发布和订阅消息。

在Go语言中使用这些消息队列,你需要先安装相应的第三方库,并按照库的文档进行配置和代码编写。