本次笔记是对三种消息队列(Kafka、RocketMQ、VerneMQ)的简介以及如何在Go语言中使用它们的说明:
1. Kafka:
- Kafka是一个分布式流处理平台,具有高吞吐量、可持久化存储和容错性等特点。
- 使用Kafka可以将消息发布到主题(Topic),然后消费者可以订阅这些主题并处理消息。
- 在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:
- RocketMQ是一个分布式消息和流式处理平台,具有高性能、可伸缩性和容错性。
- RocketMQ支持顺序消息、事务消息和广播消息等多种消息模式。
- 在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:不常用
- VerneMQ是一个开源的分布式MQTT消息代理,用于构建可扩展的物联网和实时应用。
- VerneMQ支持高并发、持久化存储、多种QoS级别和集群功能等特性。
- 在Go语言中使用VerneMQ,可以使用第三方库如eclipse/paho.mqtt.golang来实现与VerneMQ的交互。该库提供了MQTT客户端的API,可用于发布和订阅消息。
在Go语言中使用这些消息队列,你需要先安装相应的第三方库,并按照库的文档进行配置和代码编写。